为什么使用别名int&允许创建非函数类型const(int&)?

时间:2018-07-18 14:09:39

标签: c++

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

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的错误。

2 个答案:

答案 0 :(得分:5)

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

  

Cv限定的引用格式不正确,除非通过使用 typedef-name ([dcl.typedef],[temp.param])或 decltype-specifier ,在这种情况下,cv限定词将被忽略。

可以轻松进行编码。 int& const显然是错误的,允许这样做没有任何好处。 T const对于某些T可能是有效的,因此在无效的情况下拒绝它会产生积极的危害-如果您允许它,并且在这种情况下忽略无效的cv限定词,则更容易编码。

答案 1 :(得分:-3)

Microsoft compiler

它在Microsoft编译器中工作。 虽然会发出警告 警告使用了C4227过时:将忽略引用中的限定符

该标准没有禁止它,但是它被认为是格式错误的。因此它是编译器定义的。