为什么在if条件下烦恼解析?

vso*_*tco 3 c++ most-vexing-parse c++11

考虑一下代码:

#include <iostream>

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

int main()
{
    if(Foo foo{42})
    {
        std::cout << "ok\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

它在gcc5下编译得很好.但是,如果我更换线if(Foo foo{42})

if(Foo foo(42))
Run Code Online (Sandbox Code Playgroud)

我得到一个编译时错误:

错误:'foo'之前的预期primary-expression

这里发生了什么?没有令人烦恼的解析imo,为什么使用大括号工作?

Che*_*Alf 6

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

C++11§6.4/ 1:

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

这是用来在if,switch,whiledo.我很惊讶现在发现它已被用于switch.我从来没有想过这是一个条件.