在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=========== 复制构造 复制构造
我如何在可视化c++中使用移动构造函数,以及为什么visual c++拒绝在这里使用它?
发布于 2017-07-31 12:38:22
这是MSVS 2013中的一个bug。2013年不生成隐式移动构造函数。。如果您在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中移开了。
发布于 2017-07-31 12:44:23
Visual 2013并不完全兼容C++11。移动对std容器的支持是其中一个“未完全实现”的部分。您的示例对于VS2017的最新版本很好,请参见在Rextester。
P.S. 这里您可以在各种编译器中获得有关对C++特性的支持的详细信息。
https://stackoverflow.com/questions/45415955
复制相似问题