问题
Consider the code:
#include <iostream>
struct Foo
{
Foo(int){}
operator bool() const
{
return true;
}
};
int main()
{
if(Foo foo{42})
{
std::cout << "ok\n";
}
}
It compiles fine under gcc5. However, if I replace the line if(Foo foo{42})
with
if(Foo foo(42))
I get a compile-time error:
error: expected primary-expression before 'foo'
What's going on here? There is no vexing parse imo, so why using braces work?
回答1:
The syntax for a condition does not include classic constructor invocation.
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
This is used in if
, switch
, while
and do
. I was surprised to now discover that it's used in switch
. I never thought of that as a condition.
来源:https://stackoverflow.com/questions/35411163/why-vexing-parse-in-an-if-condition