【发布时间】:2016-03-28 00:39:23
【问题描述】:
我有以下简化代码示例:
#include <algorithm>
#include <iostream>
using namespace std;
class ShouldBeMovedWhenSwapped
{
public:
// ShouldBeMovedWhenSwapped() = default;
// ShouldBeMovedWhenSwapped(ShouldBeMovedWhenSwapped&&) = default;
// ShouldBeMovedWhenSwapped(const ShouldBeMovedWhenSwapped&) = default;
// ShouldBeMovedWhenSwapped& operator=(ShouldBeMovedWhenSwapped&&) = default;
struct MoveTester
{
MoveTester() {}
MoveTester(const MoveTester&) { cout << "tester copied " << endl; }
MoveTester(MoveTester&&) { cout << "tester moved " << endl; }
MoveTester& operator=(MoveTester) { cout << "tester emplaced" << endl; return *this; } // must be declared if move declared
};
MoveTester tester;
};
int main()
{
ShouldBeMovedWhenSwapped a;
ShouldBeMovedWhenSwapped b;
std::swap(a,b);
return 0;
}
我正在使用 MinGW,在运行 'gcc --version' 时我得到 gcc 4.7.2
编辑: 对于第一个问题,请参阅问题中的 cmets。这似乎是 gcc 中的一个错误。
代码的输出取决于哪些构造函数被注释掉了。但我不明白为什么会出现差异。 每个输出背后的原因是什么?
// Everything commented out
tester moved
tester copied <---- why not moved?
tester emplaced
tester copied <---- why not moved?
tester emplaced
// Nothing commented out
tester moved
tester moved
tester emplaced
tester moved
tester emplaced
// Move constructor commented out
tester copied
tester moved
tester emplaced
tester moved
tester emplaced
对于我的第二个问题(这就是我开始这个测试的原因) - 假设我有一个带有大向量而不是类 MoveTester 的真实案例,我如何确定向量被移动而不是被复制 在这种情况下?
【问题讨论】:
-
你用的是什么编译器?对我来说everything works as expected
-
很可能你使用的是旧的 GCC 编译器,我猜是 4.7.x 版本
-
@AntonSavin 谢谢!这是一种快速查看它取决于编译器的方法。我在问题中添加了信息。
-
至于我的第二个问题?
-
@user1708860:声明移动赋值
T& operator=(T&&)会移除移动构造函数T(T&&)的自动生成,因此使用了复制。
标签: c++ c++11 move move-semantics