2014-11-13 2 views
2

В 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; 
+0

Вы не можете вернуть указатель на панель. Это выходит за рамки. Хотя на самом деле я не уверен, что вы делаете. –

+1

static_cast требует скобок. –

+0

Yup, это фиктивный пример, бар не будет объявлен в рейтинге func. Мне просто сложно оценить оператор return с точки зрения приоритета (&&, == или? ..). – user3020233

ответ

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 приоритета в этом списке - ниже, чем другие используемые вами операторы, поэтому он определяет внешнюю структуру оценки. && находится на 13 - уровне ниже == в 9. (Я не думаю, что эти цифры используются в любом месте Стандарта, но они являются удобными ссылками для указания элементов в таблице cppreference).

+0

+1 для добавления этих круглых скобок - пока я не стал бы беспокоиться с '(& (static_cast (bar)))' в моем коде я бы * определенно * написал '(foo && (typeid (foo) == typeid (ValueType))) 'для удобочитаемости здесь - обертывание первого op тройного в круглых скобках, если оно сложное, экономит время обработки мозгов IMO, то же самое со сложными булевыми, математическими или побитовыми; в то время как большинство правил ООП хорошо известны большинству программистов на C/C++, это не означает, что код без доступа является легко читаемым или понятным, особенно. @ 4 утра после 16 часов кодирования ... – vaxquis

Смежные вопросы