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

时间:2016-02-15 13:52:52

标签: c++ c++11 most-vexing-parse

考虑代码:

#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))

我收到编译时错误:

  

错误:在foo&#39;

之前预期的primary-expression

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

1 个答案:

答案 0 :(得分:6)

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

C ++11§6.4/ 1:
  

条件:
  表达
   attribute-specifier-seq opt decl-specifier-seq declarator = initializer-clause
   attribute-specifier-seq opt decl-specifier-seq declarator braced-init-list

这在[{1}},ifswitchwhile中使用。我很惊讶现在发现它在do中使用过。我从没想过这是一个条件。