具有相等语句的 C++ 三元运算符

C++ Ternary Operator with Equality Statement

在调试别人的代码时,我运行变成如下形式的表达式:

auto result = value == bool_value? result_if_bool_value: result_if_not_bool_value

我熟悉三元运算符,但我对上面语句中的双重相等运算符感到困惑。

具体来说,上面用 if-else 语句编写的命令等效于什么?

条件运算符 precedence 低于 ==。因此,该行被解析为:

auto result = (value == bool_value ) ? result_if_bool_value: result_if_not_bool_value

正常

( condition ) ? expr_true : expr_false

一般情况下,条件运算符 不是 等同于 if,但你会得到与

相同的结果
T result;  // auto does not work here !!
if ( value == bool_value ) result = result_if_bool_value;
else result = result_if_not_bool_value;

或者如果你想保留 auto:

auto result = result_if_not_bool_value;
if (value == bool_value) result = result_if_bool_value;

不过,根据所涉及的实际类型,这可能会做一些与原来完全不同的事情(result_if_not_bool_value 在这里独立于条件进行评估,并且与仅初始化相比,有一个初始化和可能的一个赋值。我可以将 result_if_not_bool_valueresult_if_bool_value 交换,但随后需要否定条件,这在所有普遍性中可能会导致不同的结果。虽然这只是超级防御,但当涉及的类型表现“正常”时,主要是风格问题。)

如果 value == bool_value 计算为 trueresult 被赋值 result_if_bool_value 否则 result 被初始化 result_if_not_bool_value

声明

auto result = value == bool_value? result_if_bool_value : result_if_not_bool_value;

分组为

auto result = ((value == bool_value) ? result_if_bool_value : result_if_not_bool_value);

由于您使用了 auto,我无法简单地将其重新表述为等效的 if 语句。三元条件表达式的类型是result_if_bool_valueresult_if_not_bool_value.

的普通类型

如果 result_if_bool_valueresult_if_not_bool_value 的类型是 T,并且 T 有一个赋值运算符,那么等效的 if 块将是

T result;
if (value == bool_value){
    result = result_if_bool_value;
} else {
    result = result_if_not_bool_value;
}

完全等效的代码是(C++17 以后)

auto maker = [&](bool condition)
{
     if ( condition )
         return r1;
     else
         return r2;
};

auto result = maker(value == bool_value);

尽管可以提出一个很好的论据,即理解 lambda 和 RVO 比理解条件运算符更难。