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

时间:2014-11-13 03:09:14

标签: c++

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

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

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

if ((bar && typeid(bar)) == typeid(ValueType))
    return &static_cast<ValueType*>bar
return false;

1 个答案:

答案 0 :(得分:5)

foo && typeid(foo) == typeid(ValueType) ? &static_cast<ValueType*>bar : 0;

...在static_cast<>之后用括号更正,被评估为......

(foo && (typeid(foo) == typeid(ValueType))) ? (&(static_cast<ValueType*>(bar))) : 0;

列出了优先规则here。请注意,?:三元运算符在此列表中的优先级别为15 - 低于您使用的其他运算符,因此它定义了评估的外部结构。 &&位于== 9点以下13点。(我不认为这些数字会在标准中的任何位置使用,但它们是方便的参考,用于指出cppreference table)。