为什么这段代码可以删除副本?

Cli*_*ton 3 c++ most-vexing-parse

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

为什么这段代码可以删除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());
}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*eas 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()));
Run Code Online (Sandbox Code Playgroud)

编译器是一个函数声明.Google /搜索SO以获取最令人烦恼的解析.更多关于C++ FAQ lite的内容,包括解决方法.


[1]:这不完全相同,因为这需要隐式转换AB.如果B被定义为:

class B {
  A a;
public:
  explicit B(const A& a_) : a(a_) {}
};
Run Code Online (Sandbox Code Playgroud)

那么这不是一个替代方案.


Naw*_*waz 7

B b(A());
Run Code Online (Sandbox Code Playgroud)

你认为这声明了一个变量?没有.

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

看这个主题:


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

B b((A())); //it declares an object
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

162 次

最近记录:

14 年,10 月 前