类初始化似乎误认为是函数声明

时间:2018-12-19 19:06:15

标签: c++ syntax most-vexing-parse

采用以下示例代码:

class Foo {
public:
    Foo(int x) {}
};

class Bar {
public:
    Bar(const Foo &foo1, const Foo &foo2) {}
};

void barfunc(const Bar &bar) {}

void func()
{
    int x = 1, y = 2;
    Bar bar(Foo(x), Foo(y));
    barfunc(bar);
}

编译器抱怨:

test.cpp:17:16: error: invalid initialization of reference of type ‘const Bar&’ from expression of type ‘Bar(Foo, Foo)’
     barfunc(bar);
                ^
test.cpp:11:6: note: in passing argument 1 of ‘void barfunc(const Bar&)’
 void barfunc(const Bar &bar) {}
      ^~~~~~~

似乎将Bar bar(Foo(x), Foo(y));误认为是函数声明。当我将鼠标悬停在bar上时,Visual Studio中的工具提示将其类型指定为Bar bar(Foo x, Foo y),而不是预期的Bar bar。这对我来说很奇怪,因为我从不知道函数声明可以在参数名称的周围加上括号。

执行以下任一操作均可解决此问题:

    Bar bar = Bar(Foo(x), Foo(y));

    Bar bar((Foo)Foo(x), (Foo)Foo(y)); // though really only one cast is enough

但是我想知道是否有更好的常规方法来解决它?

0 个答案:

没有答案