整型和浮点型的三元运算符结果

10

简而言之,我有以下代码:

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是不可能的。因此,此行为是否属于未定义行为还是标准要求这种转换需要进一步澄清。

虽然从语言律师的角度来看这是一个有趣的话题,但从软件工程的角度来看,这是一种相当糟糕的编码实践。要让它变得明确。不要让编译器去猜测你的意图。 - R Sahu
@RSahu,test ? 0 : value 在我看来是非常直接的代码,它并不是“让编译器去猜测”。这是我第一次在将 0float 混合时遇到问题(尽管它实际上并不是一个 float,而是一个类似于它的类),因为当与 float 混合时,0 几乎总是(在 C 中总是)自动被视为 0.0f - Shahbaz
我理解你的观点。不幸的是,在选择某种编码实践时,很难避免个人偏见。 - R Sahu
1个回答

11

bool ? int : float 是一个浮点数。

bool ? int : some_type_convertible_to_float 不是:第三个操作数可以转换为 int(通过先转换为 float 然后再转换为 int);int(可能)无法转换为 some_type_convertible_to_float。因此根据您引用的规则,得到一个 int


突然间这变得非常简单! - Shahbaz
尽管我仍然希望C++尝试将类型减少到算术运算(在这种和类似情况下),然后进行常规提升... - Shahbaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接