static_cast,带有显式右值转换运算符

时间:2014-12-29 20:28:54

标签: c++ c++11 rvalue-reference

我正在编写一个简单的包装类,我想为包装类型提供显式转换运算符。以下代码与gcc

编译良好
class wrap
{
    double value;
public:
    explicit wrap(double x) : value(x) {}
    explicit operator double&&() && { return std::move(value); }
};

int main() {
    wrap w(5);
    double && x (std::move(w) ); //ok
    double && y = static_cast<double&&>(std::move(w)); //clang reports an error here
}

clang报告error: cannot cast from lvalue of type 'typename std::remove_reference<wrap &>::type' (aka 'wrap') to rvalue reference type 'double &&'; types are not compatible

据我所知(参见最新草案,5.2.9§4static_cast<T>(e)具有相同的语义T t(e),但clang并不拒绝后者

哪种编译器是对的?

1 个答案:

答案 0 :(得分:3)

这是铿锵声19917。从您提到的标准部分,§5.2.9/ 4:

  

表达式e可以使用T形式的static_cast显式转换为static_cast<T>(e)类型   如果声明T t(e);格式正确,对于某些发明的临时变量t

在这种情况下,T t(e);格式正确并在两个编译器上编译,因此static_cast<T>(e)也应该编译。 GCC正确地接受了它。