我正在编写一个简单的包装类,我想为包装类型提供显式转换运算符。以下代码与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§4)static_cast<T>(e)
具有相同的语义T t(e)
,但clang并不拒绝后者
哪种编译器是对的?
答案 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正确地接受了它。