简而言之,我有以下代码:
float x = cond ? 0 : x_option;
其中x_option
是一个template<float>
,它有一个operator float()
(没有其他自动转换运算符)。请注意此转换后表达式的类型:
bool ? int : float;
我预计这个表达式的结果将是一个float
。根据C11和C++11的规定,如果第二个和第三个运算对象都有算术类型,则该表达式的结果类型应为这两个操作数应用了通常的算术转换后的结果类型。然而,Clang和cl.exe在评估第三个参数时生成了一个
vcvttss2si
指令,即它们认为bool?int:float
的结果是一个int
,而不是一个float
。尽管C++11在此之前有一些规则应适用,但从我所了解的情况来看,转换为int
是不可能的。因此,此行为是否属于未定义行为还是标准要求这种转换需要进一步澄清。
test ? 0 : value
在我看来是非常直接的代码,它并不是“让编译器去猜测”。这是我第一次在将0
与float
混合时遇到问题(尽管它实际上并不是一个float
,而是一个类似于它的类),因为当与float
混合时,0
几乎总是(在 C 中总是)自动被视为0.0f
。 - Shahbaz