考虑代码:
#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,为什么使用大括号工作呢?
答案 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}},if
,switch
和while
中使用。我很惊讶现在发现它在do
中使用过。我从没想过这是一个条件。