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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std :: move(std :: array)g ++ vs visual-c ++相关的知识,希望对你有一定的参考价值。

我在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 ++拒绝在这里使用他?

答案

这是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搬走了。

另一答案

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

附: Here您可以获得有关各种编译器中C ++功能支持的详细信息。

以上是关于std :: move(std :: array)g ++ vs visual-c ++的主要内容,如果未能解决你的问题,请参考以下文章

std::move()和std::forward()

std :: move和std :: forward之间有什么区别

为啥 std::move 不能与 std::list 一起使用

std::forward 与 std::move 的用法

空范围的 std::copy() 或 std::move() 是不是需要有效目的地?

std::move与std::forward