在VS2010中移动构造函数,非const复制构造函数,列表的emplace

时间:2010-12-15 21:28:38

标签: c++

我是移动构造函数的新手,并且对VS2010的行为很困惑。 我设计了一个移动构造函数(A类),据我所知,它是这样的:

A(A&& input) {some code}

当我使用list的emplace并放置A类的实例时:

mylist.emplace(a);

我的移动构造函数未被调用,而是调用非const复制构造函数:

A(A& input) {the same code as move constructor}

另一方面,当我这样做时:

mylist.emplace(A(2));

我的移动构造函数就像它应该的那样被调用。所以,我的问题是:

  1. 为什么list的emplace会调用我的非const复制构造函数而不是我的移动构造函数?
  2. 非const复制构造函数实际上是另一种定义移动构造函数的方法吗?
  3. 这种行为是正确的(对于c ++ 0x编译器)还是只是VS2010的行为?
  4. 提前致谢了。

1 个答案:

答案 0 :(得分:2)

mylist.emplace(a);

这里a是一个l值,因此它被复制而不是移动。你需要明确move

mylist.emplace(std::move(a));

是的,行为是正确的。