Search code examples
c++c++11most-vexing-parse

Why vexing parse in an if condition?


Consider the code:

#include <iostream>

struct Foo
{
    Foo(int){}
    operator bool() const
    {
        return true;
    }
};

int main()
{
    if(Foo foo{42})
    {
        std::cout << "ok\n";
    }
}

It compiles fine under gcc5. However, if I replace the line if(Foo foo{42}) with

if(Foo foo(42))

I get a compile-time error:

error: expected primary-expression before 'foo'

What's going on here? There is no vexing parse imo, so why using braces work?


Solution

  • The syntax for a condition does not include classic constructor invocation.

    C++11 §6.4/1:

    condition:
        expression
        attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
        attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list

    This is used in if, switch, while and do. I was surprised to now discover that it's used in switch. I never thought of that as a condition.