要求通过 static_cast<double>(x) 显式调用 operator double()

Require operator double() to be explicitly called via static_cast<double>(x)

我想启用将我的 class 转换为双精度值。这可以通过重载 operator double() 来实现,但这会允许隐式转换,理想情况下我希望能够避免这种情况。

有没有办法添加此功能,但要求使用 double y = static_cast<double>(x) 进行转换,而不是隐式进行; double y = x?

我正在使用 C++17。谢谢

是的,自 C++11 起您可以显式标记转换运算符。

explicit operator double() { /* ... */ }

这将阻止复制初始化,例如,

double y = x;
return x;  // function has double return type
f(x);  // function expects double argument

同时允许显式转换,例如

double y(x);
double y = static_cast<double>(x);

使用explicit:

struct X {
    explicit operator double() const { return 3.14; }
};

double y = static_cast<double>(X{}); // ok;
double z = X{}; // error