Зачем досадный разбор в состоянии if? [дубликат]
На этот вопрос уже есть ответ здесь:
Рассмотрим код:
#include <iostream>
struct Foo
{
Foo(int){}
operator bool() const
{
return true;
}
};
int main()
{
if(Foo foo{42})
{
std::cout << "okn";
}
}
Он прекрасно компилируется под gcc5. Однако, если я заменю строку if(Foo foo{42})
на
if(Foo foo(42))
Я получаю ошибку времени компиляции:
Ошибка: ожидаемое первичное выражение перед 'foo'
Что здесь происходит? Нет никакого досадного разбора imo, так почему использование фигурных скобок работает?
1 ответ:
Синтаксис для Условия не включает классический вызов конструктора.
C++11 §6.4 / 1:Условие:
выражение
attribute-specifier-seq opt decl-specifier-seq declarator=
инициализатор-предложение
атрибут-спецификатор-слвыбрать Децл-спецификатор-сл Декларатор приготовился инициализации-списокЭто используется в
if
,switch
,while
иdo
. Я был с удивлением обнаруживаю, что он используется вswitch
. Я никогда не думал об этом как об условии.