我在visual studio 2013的项目中为我的std :: array中的元素实现移动构造函数时遇到了一些问题。
所以我尝试在notepad ++中创建一个用g ++ 5.3.0编译的最小例子 只是发现用g ++我可以做我正在尝试的事情
示例g ++:
#include <iostream>
#include <array>
using namespace std;
struct A{
A() = default;
A(const A&)
{
cout << "copy constructed" << endl;
}
A(A&&)
{
cout << "move constructed" << endl;
}
};
class B{
public:
B(array<A, 2>&& a)
: m_a(std::move(a))
{}
private:
array<A, 2> m_a;
};
int main(){
A foo;
cout << "=========1===========" << endl;
array<A, 2> a = { { foo, std::move(foo) } };
cout << "=========2===========" << endl;
B b(std::move(a));
cout << "=========3===========" << endl;
array<A, 2> a_second = std::move(a);
return 0;
}
输出:
====== 1 ===========
复制构造的 移动建造的 ========= 2 ===========
移动建造的 移动建造的 ========= 3 ===========
移动建造的 移动构造
当我在visual studio 2013中尝试(实际上)相同的代码时,结果是不同的:
输出:
====== 1 ===========
复制构造的 移动建造的 ========= 2 ===========
复制构造的 复制构造的 ========= 3 ===========
复制构造的 复制构造
我如何在visual c ++中使用move构造函数?为什么visual c ++拒绝在这里使用他?
答案 0 :(得分:4)
这是MSVS 2013中的错误.MSVS 2013 does not generate implicit move constructors。如果您在MSVS 2015或2017中运行它,您将获得相同的输出。
我还想指出
B(array<A, 2>& a) : m_a(std::move(a))
您不想将对象移动到B
。如果您希望B
接管数组,则应该
B(array<A, 2>&& a) : m_a(std::move(a))
这意味着不使用
B b(a);
你必须使用
B b(std::move(a));
现在您可以清楚地看到a
已移出main
。
答案 1 :(得分:2)
Visual Studio 2013与C ++ 11完全兼容。移动对std容器的支持就是其中之一&#34;没有完全实现&#34;部分。 您的示例适用于最新版本的VS2017,请参阅at Rextester。
P.S。 Here您可以获得有关各种编译器中C ++功能支持的详细信息。