gpt4 book ai didi

c++ - 带有显式右值转换运算符的 static_cast

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:59 25 4
gpt4 key购买 nike

我正在编写一个简单的包装类,我想为包装类型提供显式转换运算符。以下代码使用 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 并不拒绝后者。

哪个编译器是正确的?

最佳答案

这是 clang 错误 19917 .从您提到的标准部分,§5.2.9/4:

An expression e can be explicitly converted to a type T using a static_cast of the form static_cast<T>(e) if the declaration T t(e); is well-formed, for some invented temporary variable t.

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

关于c++ - 带有显式右值转换运算符的 static_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27695552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com