【问题标题】:Why copy constructor not getting called in this case为什么在这种情况下不调用复制构造函数
【发布时间】:2012-05-29 16:53:26
【问题描述】:

说,我有一个A类

现在我在做的时候

A a(A()); 

究竟发生了什么?

【问题讨论】:

  • 我想如果它没有被调用的话会被优化出来。
  • @chris 我不太确定。返回值优化 (RVO) 是允许的,但是单个函数中的副本呢?
  • @chris...我知道案例 A a = A() 的复制构造函数 elison 概念,在这种情况下调用默认构造函数。但在上述情况下,默认构造函数和复制构造函数都不是被叫
  • @Radek - 阅读问题,它就在那里! “为什么A a(B()) 不起作用?”是“为什么A a(A()) 不起作用?”的完美副本。

标签: c++ constructor copy-constructor most-vexing-parse


【解决方案1】:

尽管看起来,A a(A()); 不是对象定义。相反,它声明了一个名为 a 的函数,该函数返回一个 A 并接受一个指向函数的指针,该函数不接受任何内容并返回一个 A

如果你想要一个对象定义,你必须添加另一对括号:

A a((A()));

【讨论】:

  • 如果你不想要一组额外的括号,请使用 C++11 中的 A a{A{}} 调用复制 ctor。
  • @FredOverflow 你能详细解释一下吗:)
  • @FredOverflow....你能举个例子如何使用这个函数声明。
  • 因为它只是一个声明,而不是一个定义,如果你试图调用这个函数,你会得到一个链接器错误。不要太在意这个,只需添加额外的括号并继续您的代码;)
【解决方案2】:

如果编写正确 - A a((A())) - 编译器会直接在构造函数上下文中创建临时文件以防止额外的副本。这称为复制省略。与 RVO 和 NRVO 一起查找。

来自您的评论:

A a = A();

完全等价于

A a((A())); // note extra pair of parenthesis 

正如@Naveen 正确指出的那样,A a(A()); 是最棘手的解析,因此您需要一组额外的括号来实际创建对象。

【讨论】:

  • 这不是最令人头疼的 C++ 解析的例子吗?我尝试使用此代码:ideone.com/ZVXoT
  • @Naveen 是的,那里有额外的括号。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多