使用const int实例化std::add_const为何不会出现重复const错误?
关于std::add_const实例化const int的疑问解答
你担心的const int const语法错误其实不会发生——C++类型系统会自动合并重复的顶层const,编译器会把这种写法等价于const int,完全合法。
再看libstdc的这个实现,它看起来只是简单给_Tp加const,但其实刚好符合C标准对std::add_const的定义:
- 如果
_Tp是引用、函数类型,或者本身已经带有顶层const,add_const<_Tp>::type就是原类型_Tp; - 否则才是
_Tp const。
当你用const int实例化时,_Tp const展开成const int const,但这里的两个const都是顶层const(修饰整个int类型),编译器会自动合并为const int,和原类型完全一致,刚好达到“已有顶层const则不重复添加”的效果。
举几个不同场景的例子:
- 实例化
add_const<int*>:得到int* const(给指针本身加顶层const,合法) - 实例化
add_const<const int*>:得到const int* const(底层const+顶层const,不冲突,合法) - 实例化
add_const<int&>:因为引用类型不允许加顶层const,所以type就是int&,符合标准要求
总结:你之前的误区是误以为const int const会触发语法错误,但实际上C编译器会处理这种重复的顶层const,而libstdc的实现正是利用了这个特性来满足标准对std::add_const的行为要求。
内容的提问来源于stack exchange,提问作者Meng San-Hu
相关产品推荐
相关产品推荐

