Зачем досадный разбор в состоянии 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 3

1 ответ:

Синтаксис для Условия не включает классический вызов конструктора.

C++11 §6.4 / 1:

Условие:
    выражение
    attribute-specifier-seq opt decl-specifier-seq declarator = инициализатор-предложение
    атрибут-спецификатор-слвыбрать Децл-спецификатор-сл Декларатор приготовился инициализации-список

Это используется в if, switch, while и do. Я был с удивлением обнаруживаю, что он используется в switch. Я никогда не думал об этом как об условии.