C++ 为什么显式运算符bool让我强制转换为任何基元类型? struct测试 { 显式运算符bool()常量{return true;} }; int main() { 试验a; 浮动b=静态_转换(a);//b=1 }

C++ 为什么显式运算符bool让我强制转换为任何基元类型? struct测试 { 显式运算符bool()常量{return true;} }; int main() { 试验a; 浮动b=静态_转换(a);//b=1 },c++,visual-studio-2012,c++11,implicit-conversion,C++,Visual Studio 2012,C++11,Implicit Conversion,允许这样做是正确的,还是一个VS错误?如果按照设计,这里的最佳实践是什么?我应该/可以做些什么来防止这种情况吗?这看起来像是一个VS错误:显式运算符不应该在转换中应用于除bool之外的类型 这无法在和中的gcc中编译 我能做些什么来防止这种情况吗 你已经完成了你需要做的事情-这是编译器的问题。添加一个通用的=delete转换应该可以帮助编译器认识到它的错误: struct test { explicit operator bool() const { return true; } };

允许这样做是正确的,还是一个VS错误?如果按照设计,这里的最佳实践是什么?我应该/可以做些什么来防止这种情况吗?

这看起来像是一个VS错误:显式运算符不应该在转换中应用于除
bool
之外的类型

这无法在和中的gcc中编译

我能做些什么来防止这种情况吗


你已经完成了你需要做的事情-这是编译器的问题。

添加一个通用的
=delete
转换应该可以帮助编译器认识到它的错误:

struct test
{
    explicit operator bool() const { return true; }
};

int main()
{
    test a;
    float b = static_cast<float>(a); // b = 1
}
struct测试
{
显式运算符bool()常量{return true;}
模板显式运算符T()const=delete;
};
看到了吗(没有MSVC:)

intmain()
{
试验a;
浮动b=静态_转换(a);//b=1
float c=静态_cast(a);//c=?
}

VS2012支持显式转换运算符?@C.R.在CTP中,yesVS2012不支持删除函数。@然后,您可以使用旧的C++98解决方法:声明
模板显式运算符t()常量但不要定义它。此外,将其设置为私有。
struct test
{
    explicit operator bool() const { return true; }
    template<typename T> explicit operator T() const = delete;
};
int main()
{
    test a;
    float b = static_cast<bool>(a);  // b = 1
    float c = static_cast<float>(a); // c = ?
}