C++中using A = ::B::C<::D::E, F>语句解读及使用疑问
关于C++语句
using A = ::B::C<::D::E, F> 的详细解答 先明确原语句是C++11及以后的类型别名声明,下面逐个解答你的疑问:
疑问1:using作为别名关键字的正确性
- 完全正确。
using在这里的作用就是定义类型别名,后续代码中所有需要写::B::C<::D::E, F>的地方,都可以直接用A替代,二者语义完全等价。这和C++11之前的typedef功能类似,但using的语法更清晰,尤其在处理模板别名时优势更明显。
疑问2:B前的::的作用
::是全局命名空间解析符。因为B是命名空间,前面加::表示强制从全局命名空间中查找名为B的命名空间,避免和当前作用域(比如局部命名空间、类内部)中同名的标识符冲突。举个简单例子:如果当前代码里有一个局部的namespace B,加::就明确告诉编译器要使用全局的那个B命名空间。
疑问3:B前和D前的::含义是否相同
- 完全相同,都是全局命名空间解析符。
::D::E表示从全局命名空间找到D命名空间,再从D中获取E这个类型(或模板参数),作用和::B一致,都是明确指定查找的起始范围是全局命名空间。
疑问4:尖括号<>的作用,能否当作函数()`
- 尖括号在这里是模板参数列表的标记,和函数的圆括号
()完全不是一个概念。::B::C是一个类模板(或别名模板),<::D::E, F>是给这个模板传入的两个模板参数,用来实例化出一个具体的类型::B::C<::D::E, F>。这是模板特化/实例化的语法,和函数调用没有关系。
疑问5:如何使用A,能否像函数那样用A(G, H)
- A是一个具体的类型,不是函数,所以不能直接用
A(G, H)这种函数调用的方式。使用方式和普通类类型一致:- 定义无参对象:
A my_object; - 如果A的构造函数需要参数,用构造语法传参:
A my_object(G, H);(这里的圆括号是构造对象时传递构造参数,不是调用A) - 声明指针或引用:
A* ptr = new A(G, H); - 作为函数参数或返回值:
void func(A param); A create_A();
- 定义无参对象:
内容的提问来源于stack exchange,提问作者Trilokinath Modi
相关产品推荐
相关产品推荐

