Clang&GCC以不同的方式诠释系列演员表



以下:

#include <iostream>
int& addone(int& r) {
    return ++r;
}
int main() {
    std::cout << addone((int&)(int&&)7) << std::endl;
}

编译,运行和打印8,即使在-wall -wall -wextra -werror -pedantic。
但是,使用GCC,它根本没有编译,即使使用-fpermissive。

这里是正确的?(最好用报价)

clang结果,这里的GCC结果

看来第一个转换是可以的。您将整数文字转换为prvalue-将其转换为rvalue参考。这会导致临时物质化转换:

[cons.rval] T型的序言可以转换为T型的XVALUE。这种转换通过以临时对象作为结果对象评估prvalue,从prvalue类型t的临时对象([class.temporary])开始,并且产生xvalue 表示临时对象。/blockquote>

让我们考虑转换为lvalue参考:

[dcl.init.ref]对" CV1 T1"类型的引用是通过类型的" CV2 T2"的表达来初始化的,如下所示:

如果参考是LVALUE参考,并且初始化器表达式

  • 是一个LVALUE(不适用,表达式不是LVALUE)

  • 具有类型(不适用,该类型为int&amp;&amp;)

否则,如果参考是lvalue参考不const-Qualified 或挥发性标记的类型,则该程序为>不正确。(适用)

看来该程序的形式不佳。Clang缺乏诊断表明一个编译器错误。

最新更新