C++ 为什么别名int&;是否允许创建非函数类型const(int&;)?

C++ 为什么别名int&;是否允许创建非函数类型const(int&;)?,c++,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&”)上的“

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

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限定符]

#2给了我一个错误:

[x86-64 clang(实验性P1144)#1]错误:“const”限定符不能应用于引用


x86-64 gcc(trunk)为#2提供了一个错误,但为#1提供了一个错误

这只是规则。发件人:

Cv限定引用的格式不正确,除非Cv限定符是通过使用typedef名称([dcl.typedef]、[temp.param])或decltype说明符引入的,在这种情况下,Cv限定符被忽略

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

它在Microsoft编译器中工作。 尽管它发出了警告 警告C4227使用了时间错误:引用上的限定符被忽略


本标准不禁止使用,但认为格式不正确。因此它是由编译器定义的。

当T是引用类型时,“T const”不被禁止有什么原因吗?@DDaniel因此当unessesary@Slava当前位置我无法理解为什么不允许这种情况被认为是“有害的”或“不必要的”。const被“忽略”这一事实会不会被认为是危险的,因为我可以更改这样一个变量的值,即使它应该是常量?只是好奇规则背后的原因。这是标准所禁止的。