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,为什么使用大括号工作?
条件的语法不包括经典构造函数调用.
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,while和do.我很惊讶现在发现它已被用于switch.我从来没有想过这是一个条件.