繁体   English   中英

C ++ 11:为什么在这里调用复制ctor?

[英]C++11 : Why is the copy ctor being called here?

考虑下面运行C ++ 11的代码。 如果我正确理解了移动语义,则不应调用复制构造函数。 但它是。 有人可以解释为什么吗?

template<class D>
struct traced
{
public:
  traced() = default;
  traced(traced const&) { std::cout << typeid(D).name() << " copy ctor\n"; }

protected:
  ~traced() = default;
};


class A : public traced<A>{
public:
  A(int x) : x_(x) {}
private:
  int x_;
};

int main() {
  // I thought the following two are equivalent. Apparently not.
  aList.push_back(A(6)); // Prints out ".. copy ctor" ..
  aList.emplace_back(6); // Does not print out " ... copy ctor"
}
aList.push_back(A(6));

这将构造一个临时A并将其移入容器。 调用了A隐式生成的move构造函数,它需要从临时对象的基本子对象构造基本traced<A> 但是, trace显式声明了一个拷贝构造函数,因此默认情况下它没有移动构造函数,并且A的move构造函数仍需要为其基类子对象执行一个拷贝。

aList.emplace_back(6); 

这将A直接构造到容器中。 不涉及任何形式的复制或移动。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM