gpt4 book ai didi

c++ - 三元运算符求值顺序

转载 作者:太空狗 更新时间:2023-10-29 23:25:15 25 4
gpt4 key购买 nike

class Foo {
public:
explicit Foo(double item) : x(item) {}

operator double() {return x*2.0;}

private:
double x;
}

double TernaryTest(Foo& item) {
return some_condition ? item : 0;
}

Foo abc(3.05);
double test = TernaryTest(abc);

在上面的例子中,如果 some_condition 为真,为什么 test 等于 6(而不是 6.1)?

像下面这样更改代码返回值 6.1

double TernaryTest(Foo& item) {
return some_condition ? item : 0.0; // note the change from 0 to 0.0
}

似乎(在原始示例中)Foo::operator double 的返回值被强制转换为 int,然后返回到 double。为什么?

最佳答案

条件运算符检查两个方向的转换。在这种情况下,由于您的构造函数是显式的(因此 ?: 没有歧义),因此使用了从 Fooint 的转换,使用转换为 double 的转换函数:这是有效的,因为在应用转换函数之后,将 double 转换为 int 的标准转换(截断) 如下。在您的例子中,?: 的结果是 int,并且值为 6

在第二种情况下,由于操作数的类型为 double,因此不会发生到 int 的尾部转换,因此结果类型为 ?: 具有具有预期值的 double 类型。

要了解“不必要的”转换,您必须了解像您的 ?: 这样的表达式是“上下文无关的”求值:在确定它的值和类型时,编译器不会认为它是返回 double 的函数的 return 的操作数。


编辑:如果您的构造函数是隐式 会怎样? ?: 表达式将是不明确的,因为您可以将 int 转换为 Foo 类型的右值(使用构造函数),而 Fooint 类型的右值(使用转换函数)。标准说

Using this process, it is determined whether the second operand can be converted to match the third operand, and whether the third operand can be converted to match the second operand. If both can be converted, or one can be converted but the conversion is ambiguous, the program is ill-formed.


解释您的 Foo 如何转换为 int 的段落:

5.16/3 关于条件? E1:E2:

Otherwise, if the second and third operand have different types, and either has (possibly cv-qualified) class type, an attempt is made to convert each of those operands to the type of the other. [...] E1 can be converted to match E2 if E1 can be implicitly converted to the type that expression E2 would have if E2 were converted to an rvalue (or the type it has, if E2 is an rvalue).

4.3关于“隐式转换”:

An expression e can be implicitly converted to a type T if and only if the declaration T t = e; is well-formed, for some invented temporary variable t.

8.5/14 关于复制初始化 ( T t = e; )

If the source type is a (possibly cv-qualified) class type, conversion functions are considered. The applicable conversion functions are enumerated (13.3.1.5), and the best one is chosen through overload resolution (13.3). The user-defined conversion so selected is called to convert the initializer expression into the object being initialized. If the conversion cannot be done or is ambiguous, the initialization is ill-formed.

13.3.1.5 关于候选转换函数

The conversion functions of S and its base classes are considered. Those that are not hidden within S and yield type T or a type that can be converted to type T via a standard conversion sequence (13.3.3.1.1) are candidate functions.

关于c++ - 三元运算符求值顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1445274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com