首页 > 解决方案 > 为什么别名 int& 允许创建非函数类型 const (int&)?

问题描述

通常在使用常量到引用时会出现编译器错误,但在使用别名或使用模板时不会。为什么会这样?

int a = 5;
using my_t = int&;
my_t const b = a; //#1 OK 
int& const c = a; //#2 Compiler error

通过最新的 clang 编译器(x86-64 clang(实验性 P1144))运行时,#1 给了我警告:

[x86-64 clang (experimental P1144) #1] 警告:引用类型 'my_t' (aka 'int &') 上的 'const' 限定符没有效果 [-Wignored-qualifiers]

和#2给我错误:

[x86-64 clang (experimental P1144) #1] 错误:'const' 限定符可能不适用于引用。

x86-64 gcc (trunk) 给 #2 一个错误,但给 #1 一个错误。

标签: c++

解决方案


这只是规则。来自[dcl.ref]/1

cv 限定的引用格式错误,除非通过使用typedef-name ([dcl.typedef], [temp.param]) 或decltype-specifier引入cv 限定符,在这种情况下 cv 限定符是忽略。

它的存在是为了更容易编码。int& const显然是错误的,允许它没有任何好处。T const可能对某些Ts 有效,因此拒绝它会非常有害 - 如果您允许它并在这些情况下忽略无效的 cv 限定符,则编码会更容易。


推荐阅读