这个布尔表达式是如何评估的?

use*_*233 1 c++

在C++中,让以下构造:

template<typename ValueType>
ValueType * func(Foo * foo)
{
    Bar bar;
    return foo && typeid(foo) == typeid(ValueType) ? &static_cast<ValueType*>bar : 0;
}
Run Code Online (Sandbox Code Playgroud)

如何评估退货声明?像这样?

if ((bar && typeid(bar)) == typeid(ValueType))
    return &static_cast<ValueType*>bar
return false;
Run Code Online (Sandbox Code Playgroud)

Ton*_*roy 5

foo && typeid(foo) == typeid(ValueType) ? &static_cast<ValueType*>bar : 0;
Run Code Online (Sandbox Code Playgroud)

...后用括号校正static_cast<>,被评估为......

(foo && (typeid(foo) == typeid(ValueType))) ? (&(static_cast<ValueType*>(bar))) : 0;
Run Code Online (Sandbox Code Playgroud)

此处列出优先规则.请注意,?:三元运算符在此列表中的优先级别为15 - 低于您使用的其他运算符,因此它定义了评估的外部结构. &&在13 -下面的方法==在9.(我不认为这些数字是在标准的任何地方使用,但他们在cppreference表指出东西方便引用).