首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移动(std::g++ )对visual-c++

移动(std::g++ )对visual-c++
EN

Stack Overflow用户
提问于 2017-07-31 12:28:01
回答 2查看 168关注 0票数 3

在visual studio 2013中,我在我的项目中为我的std::array中的一个元素实现了迁移构造函数时遇到了一些问题。

所以我试着用notepad++做一个最小的例子,用g++ 5.3.0编译。

结果发现在g++我可以做我想做的事

示例g++:

代码语言:javascript
复制
#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++拒绝在这里使用它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-31 12:38:22

这是MSVS 2013中的一个bug。2013年不生成隐式移动构造函数。。如果您在MSVS 2015或2017中运行它,您将得到相同的输出。

我也想指出,

代码语言:javascript
复制
B(array<A, 2>& a) : m_a(std::move(a))

不是以何种方式将对象移动到B中。如果你想让B接管数组,你应该有

代码语言:javascript
复制
B(array<A, 2>&& a) : m_a(std::move(a))

这意味着与其使用

代码语言:javascript
复制
B b(a);

你必须用

代码语言:javascript
复制
B b(std::move(a));

现在您可以清楚地看到,a已经从main中移开了。

票数 4
EN

Stack Overflow用户

发布于 2017-07-31 12:44:23

Visual 2013并不完全兼容C++11。移动对std容器的支持是其中一个“未完全实现”的部分。您的示例对于VS2017的最新版本很好,请参见在Rextester

P.S. 这里您可以在各种编译器中获得有关对C++特性的支持的详细信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45415955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档