为什么要在 if 条件下进行解析?

Why vexing parse in an if condition?

考虑代码:

#include <iostream>

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

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

它在 gcc5 下编译良好。但是,如果我将行 if(Foo foo{42}) 替换为

if(Foo foo(42))

我遇到编译时错误:

error: expected primary-expression before 'foo'

这是怎么回事?没有令人烦恼的解析 imo,那么为什么使用大括号有效?

条件 的语法不包括经典构造函数调用。

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

这用于 ifswitchwhiledo。现在我惊讶地发现 switch 中使用了它。我从没想过这是一个条件。