C++ std::move(std::array)g++;vs visual c++;

C++ std::move(std::array)g++;vs visual c++;,c++,c++11,visual-studio-2013,C++,C++11,Visual Studio 2013,在visual studio 2013的项目中,我在为std::数组中的元素实现移动构造函数时遇到一些问题 因此,我尝试用记事本++制作一个我用g++5.3.0编译的最小示例。 结果发现在g++中我可以做我想做的事情 示例g++: #include <iostream> #include <array> using namespace std; struct A{ A() = default; A(const A&) {

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

因此,我尝试用记事本++制作一个我用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;
}
#包括
#包括
使用名称空间std;
结构A{
A()=默认值;
A(常数A&)
{

cout这是MSVS 2013.MSVS 2013中的一个bug。如果您在MSVS 2015或2017中运行它,您将获得相同的输出


我还要指出这一点

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,请参阅


<> P.S.您可以在各种编译器中获得关于C++特性的详细信息。

OT,您是否真的需要发布两个代码示例,因为不必要的<代码> STDAFX.H< /C>和<代码>?
不是您希望将某个对象移动到对象中的方式。您将该对象留在调用站点中,但没有任何迹象表明它是移动的。@LogicStuff我想表明我没有做任何不同的事情。@NathanOliver我将在更好的版本中编辑,我通过大量构造函数循环找到可以工作的东西这是最新的一个但确实不是一个好的界面。@turoni——我不反对
std::
;这是使用标准库中的东西的正确方法。而且
“\n”
std::endl
做的事情不同;它做的更少——它开始了一行新的代码。(这是一个提示:阅读
std::endl
的实际用途,并决定是否需要它)我刚刚为B编辑了更好的构造函数。有什么方法可以在MSV2013中得到相同的结果吗?@turoni不幸的是没有。它只是不能正常工作。@turoni你可以像继承一样编写一个类型包装
std::array
,然后手动实现移动构造函数。MSVC2013从来没有为你编写过正确的移动构造函数,不是吗让你
noexcept
。MSVC2017需要一个合适的
noexcept
才能在
std::vector
中正常工作。这是一个巨大的痛苦。
B b(std::move(a));