从右值重新解释到右值引用

时间:2019-05-26 19:17:08

标签: c++ standards-compliance

只需简单地进行编译测试即可。 gcc接受以下内容,而clang和msvc拒绝它:https://godbolt.org/z/DlUasL

float test()
{
    return reinterpret_cast<float&&>(0x7F800000);
}

哪个符合标准?

1 个答案:

答案 0 :(得分:8)

reinterpret_cast表达式要执行的转换不在reinterpret_cast可以执行[expr.reinterpret.cast]的转换[expr.reinterpret.cast]/1的列表中。 0x7F800000是整数类型的文字。 reinterpret_cast唯一可以执行的将整数类型的值从转换为其他类型的转换是将此类值转换为指针类型[expr.reinterpret.cast]/5float&&是引用类型,而不是指针类型。 reinterpret_cast唯一可以执行的将转换为引用类型的转换就是转换glvalue表达式[expr.reinterpret.cast]/11的转换。 0x7F800000不是glvalue。因此,该代码格式错误。 GCC接受这一事实令我非常惊讶,我想肯定是一个应该报告的错误……