std::move(std::array) g++ vs visual-c++

std::move(std::array) g++ vs visual-c++

本文关键字:std vs visual-c++ g++ array move      更新时间:2023-10-16

我在Visual Studio 2013的项目中为我的std::array中的元素实现移动构造函数时遇到了一些问题。

所以我尝试在记事本++中制作一个最小的示例,我用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=======================移动

构造
的移动
构造==


==================移动构造的移动
已构造

当我在Visual Studio 2013中尝试(实际上(相同的代码时,结果是不同的:

输出:

==========1===========复制构造


移动==========2===================复制构造的副本已构造=
=======3==


=========复制构造的副本已构造


如何在 visual c++中使用移动构造函数,为什么 visual c++ 拒绝在这里使用他?

这是 MSVS 2013 中的一个错误。 MSVS 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中移出.

>Visual Studio 2013 与 C++11 不完全兼容。对 std 容器的移动支持是"未完全实现"的部分之一。 您的示例适用于最新版本的VS2017,请参阅Rextester。

附言在这里,您可以获得有关各种编译器中C++功能支持的详细信息。