采用以下示例代码:
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
但是我想知道是否有更好的常规方法来解决它?