以下:
#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缺乏诊断表明一个编译器错误。