为什么要在 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
这用于 if
、switch
、while
和 do
。现在我惊讶地发现 switch
中使用了它。我从没想过这是一个条件。
考虑代码:
#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
这用于 if
、switch
、while
和 do
。现在我惊讶地发现 switch
中使用了它。我从没想过这是一个条件。