【问题标题】:Why does aliasing int& allow for the creation of the non-function type const (int&)?为什么别名 int& 允许创建非函数类型 const (int&)?
【发布时间】:2018-07-18 14:09:38
【问题描述】:

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

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 (experimental P1144)) 运行时,#1 给了我警告:

[x86-64 clang (experimental P1144) #1] warning: 'const' qualifier on reference type 'my_t' (aka 'int &') has no effect [-Wignored-qualifiers]

而 #2 给了我错误:

[x86-64 clang (experimental P1144) #1] error: 'const' qualifier may not be applied to a reference。

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

【问题讨论】:

    标签: c++


    【解决方案1】:

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

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

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

    【讨论】:

    • 当 T 是引用类型时,是否有理由不禁止“T const”?
    • @DDaniel 所以模板代码在不必要时不会受到影响
    • @Slava:我无法理解为什么不允许这种情况被认为是“有害的”或“不必要的”。 const 被“忽略”的事实不会被认为是危险的,因为即使它应该是常量,我也可以更改这样一个变量的值?只是对规则背后的推理感到好奇。
    【解决方案2】:

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

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

    【讨论】:

    • 标准禁止的。
    猜你喜欢
    • 1970-01-01
    • 2018-11-29
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    相关资源
    最近更新 更多