4

我有这两个类:

class Foo
{
public:
      Foo() { std::cout << "in Foo constructor" << std::endl; }
};
class Bar
{
public:
    Bar() {};
    Bar(Foo foo);
private:
    Foo m_foo;
};

Bar::Bar(Foo foo) :
    m_foo(foo)
{
    std::cout << "in Bar constructor with argument Foo" << std::endl;
}

int main() {
    Bar bar(Foo()); // is something wrong here ?
    return 0;
}

我编译并执行它,屏幕上没有打印,做了Bar bar(Foo())什么?我在类型名称后的括号是否与新的不同?Foo f = Foo(); // 没有匹配的函数调用 'Foo::Foo(Foo)',但我还是想不通。

4

2 回答 2

1

为了在不改变语义的情况下达到同样的效果(即不使用复制或赋值构造函数),请添加括号以消除语法歧义(编译器不知道您是在本地声明函数还是构建对象,默认情况下前者是由 C++ 标准优先):

int main() {
    Bar bar ( (Foo()) );
    return 0;
}

正如评论中发布的维基百科页面所指出的,这是 C++ 语法本身的问题,您对此无能为力。

于 2013-04-05T04:37:28.747 回答
0

好的,有人指出编译器认为您正在声明一个函数。由PubbyNbr44 提供。这是一种绕过它的方法。只需让编译器知道您正在声明变量。

int main() {
    Bar bar = Foo();
    return 0;
}
于 2013-04-05T04:26:00.547 回答