3

可能的重复:
构造函数调用机制
为什么使用空括号调用不带参数的构造函数会出错?

为什么这段代码可以省略 A 的所有副本?

#include <iostream>

class A
{
public:
  A() {}
  A(const A&) { std::cout << "Copy" << std::endl; }
};

class B
{
public:
  B(const A& a_) : a(a_) {}
private:
  A a;
};

int main()
{
  B b(A());
}

这段代码显然不复制A,并且在 ideone 的 gcc 3.4 下不输出任何内容。

4

3 回答 3

9

问题不在于复制省略,而在于声明的含义:

B b(A());
// To get it working the way you expect [1]
B b = B(A());
// Or the slightly more obtuse.
B b((A()));

对编译器来说是一个函数声明。谷歌/搜索最令人烦恼的解析。C++ FAQ lite中的更多内容,包括解决方法。


[1]:这不完全相同,因为这需要从to的隐式转换。如果定义为:ABB

class B {
  A a;
public:
  explicit B(const A& a_) : a(a_) {}
};

那么这将不是一个替代方案。

于 2011-07-14T08:13:03.847 回答
7
B b(A());

你认为这声明了一个变量?不。

它声明了一个函数b,它的返回类型是B并且接受一个类型的参数A (*)()

请参阅此主题:


因此,如果您想声明一个变量,请在周围放置一个额外的大括号A()

B b((A())); //it declares an object
于 2011-07-14T08:12:41.957 回答
1

采用:

B b((A()));

你的行是一个函数声明。不幸的是,C 允许在函数内部声明函数(顺便说一句,这对我来说似乎毫无用处),因此出于向后兼容性的原因,C++ 允许这样做。您可以使用额外的括号强制执行变量定义。

于 2011-07-14T08:15:42.980 回答