hhhhhh 建议暂时先记住用法,这块能展开的东西多了去
::这个符号跟 C++最邪恶晦涩的部分( templates )紧密相关,但简单来说,他只有一个含义,就是“属于 namespace ”
A::a 这个语法,在 C++里,是 ambiguous 的,唯一能确定的是,a 在 A namespace 中(如果把 class 也看做是 namespace 的话),所以先不要先入为主认为 A::a 一定是表示变量或者类型,实际上 A 也好 a 也好,它们可以是变量,可以是类型,甚至还可以是一个 incomplete type (在类型推导中),一个最令人颤抖的例子是 STO 上关于 C++语言是否是 context-free 的讨论:
https://stackoverflow.com/questions/14589346/is-c-context-free-or-context-sensitive由于 C++的 templates 是 Turing Complete 的,所以,推导 A::a 的 a 到底是什么东西,的这个过程,是 Turing Complete 的,理论上你可以写出一个“推测出 a 是什么东西的时候处理完一次 HTTP 请求”这样的程序
与之相比,A.a,必定代表 访问 对象 A 的成员 a,a 一定被绑定到实例 A,这个 syntax 是不存在歧义性的
然后至于为什么要有::这种东西
这么说,当你不需要用 templates 的时候,它仅仅表示一个名字所属的限定,真的没什么用,你甚至可以手动 A_B_c 这样子从命名上划分 namespace
但用到 templates 的时候,模板有一个决定性的特性是
A<特化 1>::v
与
A<特化 2>::v
可以不同,但不同的 v 都可以用同一个 dependent type 去使用,这个时候 A<T>::v 的 v 是什么取决于 T,而 T 是可随着模板实例化位置的上下文不同,会自动改变的!这个时候可以说::的作用是使一个 type 能够依赖于另一个 type,而这也编译期多态的关键
展开太多估计也看不懂,而且我表达得也很可能不准确。
四点:
c++里 value 和 type 永远是俩种东西,不存在 python 中“ class 是 type object ”这么混沌的语义
c++里::这个运算符仅仅表示 namespace 所属,左右两边到底是 type 还是 value 都有可能
就你的例子来说 typedef 在外面当然可以,但定义在里面的 dependent type 肯定是有自己作用的
static 变量其实就是把它所在的 class 看做一个 namespace,它自己是这个 namespace 下的变量,对比一下全局变量和 namespace 中的“全 namespace 变量”就明白了