C++ 为什么显式运算符bool让我强制转换为任何基元类型? struct测试 { 显式运算符bool()常量{return true;} }; int main() { 试验a; 浮动b=静态_转换(a);//b=1 }
允许这样做是正确的,还是一个VS错误?如果按照设计,这里的最佳实践是什么?我应该/可以做些什么来防止这种情况吗?这看起来像是一个VS错误:显式运算符不应该在转换中应用于除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; } };
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 = ?
}