在C++中,使用以下构造:
template<typename ValueType>
ValueType * func(Foo * foo)
{
Bar bar;
return foo && typeid(foo) == typeid(ValueType) ? &static_cast<ValueType*>bar : 0;
}
return语句是如何求值的?像这样吗?
if ((bar && typeid(bar)) == typeid(ValueType))
return &static_cast<ValueType*>bar
return false;
2条答案
按热度按时间rt4zxlrg1#
...在
static_cast<>
后用括号更正,计算为...优先级规则列在here中。请注意,
?:
三元运算符在此列表中的优先级为15-低于您使用的其他运算符,因此它定义了计算的外部结构。&&
的优先级比==
的优先级9低13级。(我不认为这些数字在标准中的任何地方都有使用,但是它们是在cppreference表中指出事情的方便参考)。uqcuzwp82#
发布的答案正确地解决了 * 运算符优先级 * 问题:
这就是表达式的解析方式--编译器将哪些操作数视为属于哪个运算符,但这并没有说明表达式的求值方式(基本上是"执行"),因此它没有回答以下问题:
如何计算这个布尔表达式?
表达式 * 计算 * 为:
foo
被求值。false
,则(typeid(foo) == typeid(ValueType))
将 * 不 * 被求值,并且整个子表达式将被求值为false
。true
,则(typeid(foo) == typeid(ValueType))
将被求值。==
的两个操作数都将被求值(如果适用,则调用重载运算符)。如果整个表达式为true
,则&&
的结果也为true
。true
,则将求值第二个操作数(&(static_cast<ValueType*>(bar)))
。false
,则将评估第三操作数0
。值得注意的是,
?:
的第二个和第三个操作数需要是相同的类型。在指针的情况下,这意味着完全相同的类型,尽管如果一个操作数是空指针,在这种情况下,结果将是另一个操作数的类型。在算术类型的情况下,第二个和第三个操作数将获得"平衡",按照通常的算术转换。表达式
&static_cast<ValueType*>bar
在很多方面都很可疑,除了缺少括号,你不能将bar
转换为指针类型,而且你也不应该在类型之间使用wild type双关语。