Why vexing parse in an if condition? [duplicate]

守給你的承諾、 提交于 2019-12-22 11:04:50

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!