C+中的隐式转换+; 在C++中,我试图使用条件运算符使用隐式转换。考虑这个例子: class MyFloat { public: MyFloat(float val){m_val = val;} operator float(){return m_val;} protected: float m_val; }; int main(int argc, char **argv) { MyFloat a = 0.5f; MyFloat b = 1.0f; float x = true ? a-0.5f : b; return 0; }

C+中的隐式转换+; 在C++中,我试图使用条件运算符使用隐式转换。考虑这个例子: class MyFloat { public: MyFloat(float val){m_val = val;} operator float(){return m_val;} protected: float m_val; }; int main(int argc, char **argv) { MyFloat a = 0.5f; MyFloat b = 1.0f; float x = true ? a-0.5f : b; return 0; },c++,casting,implicit-conversion,conditional-operator,C++,Casting,Implicit Conversion,Conditional Operator,它会导致编译器错误: error: operands to ?: have different types ‘MyFloat’ and ‘float’ 我希望条件运算符将b隐式转换为a-0.5,float类型。但事实并非如此。如何实现这种隐式转换 理想情况下,我希望避免静态强制转换或访问器方法,如float MyFloat::getValue()问题是有两种转换。编译器可以将a-0.5转换为MyFloat,也可以将b转换为float。只要你有两个转换,并且没有一个被标记为显式,你就会一直得到这

它会导致编译器错误:

error: operands to ?: have different types ‘MyFloat’ and ‘float’
我希望条件运算符将
b
隐式转换为
a-0.5
,float类型。但事实并非如此。如何实现这种隐式转换


理想情况下,我希望避免静态强制转换或访问器方法,如
float MyFloat::getValue()

问题是有两种转换。编译器可以将
a-0.5
转换为
MyFloat
,也可以将
b
转换为
float
。只要你有两个转换,并且没有一个被标记为显式,你就会一直得到这种模糊性。

如果我没记错的话,三元运算符不会做任何隐式转换。你要么写

static_cast<MyFloat>(a-0.5) 
static_cast(a-0.5)

static_cast(b)。

当我回家了解更多细节时,我会深入研究C++标准文档。

只为你做了一些转换。从

第一个操作数必须是整数或指针类型。以下规则适用于第二和第三个表达式:

  • 如果两个表达式的类型相同,则结果为该类型
  • 如果这两个表达式都是算术类型或枚举类型,则执行通常的算术转换(包含在算术转换中)以将它们转换为公共类型
  • 如果两个表达式都是指针类型,或者一个是指针类型,另一个是计算结果为0的常量表达式,则将执行指针转换以将它们转换为公共类型
  • 如果两个表达式都是引用类型,则执行引用转换以将它们转换为公共类型
  • 如果两个表达式都是void类型,则公共类型为void类型
  • 如果两个表达式都是给定的类类型,则公共类型为该类类型

您从“隐式转换”开始做得很好,然后在“隐式转换”中失败。强制转换是您在源代码中编写的命令编译器进行转换的内容。没有隐式强制转换。我只是尝试在MS Visual Studio 2012 Professional中编译并运行您的代码。0个错误,0个警告,效果良好。@LihO,它在GCC中失败:如果您必须定义隐式转换,那么定义一个执行完全相同操作的成员函数仍然很有用,例如,通过
,等等。添加
float MyFloat::getValue()const
不会让你的界面变得比现在更糟糕:它为某人添加了一种获得浮点值的方法,当你已经赋予了获得浮点值的能力而没有任何意义的时候,你可以准确地说出他们在做什么。编译器将这两个参数转换为它们的公共类型。好吧,我们可以忽略这个答案。我也投票支持你的答案,因为这可能是他的代码无法编译的原因。这也解释了为什么@LihO让它用Visual Studio编译。但是这些规则与语言定义不匹配。我也看到了,但它与另一个参考不一致:谢谢你的回答和关于转换与强制转换的更正。
static_cast<float>(b).