通常,在对引用使用常量时会出现编译器错误,但在使用别名或使用模板时则不会。为什么会这样?
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(实验性P1144)#1]警告:引用类型'my_t'(又名'int&')上的'const'限定词无效 [-Wignored-qualifiers]
和#2给我错误:
[x86-64 clang(实验性P1144)#1]错误:“ const”限定符可能不适用于参考。
x86-64 gcc(trunk)给出了#2的错误,但没有给出#1的错误。
答案 0 :(得分:5)
这只是规则。来自[dcl.ref]/1:
Cv限定的引用格式不正确,除非通过使用 typedef-name ([dcl.typedef],[temp.param])或 decltype-specifier ,在这种情况下,cv限定词将被忽略。
可以轻松进行编码。 int& const
显然是错误的,允许这样做没有任何好处。 T const
对于某些T
可能是有效的,因此在无效的情况下拒绝它会产生积极的危害-如果您允许它,并且在这种情况下忽略无效的cv限定词,则更容易编码。
答案 1 :(得分:-3)