C++ 从类中移动向量(vs 2013编译器)

C++ 从类中移动向量(vs 2013编译器),c++,visual-studio-2013,move-semantics,C++,Visual Studio 2013,Move Semantics,我想把向量从课堂上移开 class Data { public: std::vector<int> && getValues() {return std::move(values);} private: std::vector<int> values; }; 类数据 { 公众: std::vector&&getValues(){return std::move(values);} 私人: std::向量值

我想把向量从课堂上移开

class Data
{
    public:
        std::vector<int> && getValues() {return std::move(values);}

    private:
        std::vector<int> values;
};
类数据
{
公众:
std::vector&&getValues(){return std::move(values);}
私人:
std::向量值;
};
我使用vs2013编译器,据我所知,它不支持ref限定符。我怎样才能安全地移动

Data d;
std::vector<int> v1;
std::vector<int> v2;
...
v1=d.getValues(); //i want copy
v2=std::move(d.getValues());  // i want move
datad;
std::向量v1;
std::向量v2;
...
v1=d.getValues()//我要复印件
v2=std::move(d.getValues());//我要搬家

仅通过正常引用返回:

class Data
{
public:
    const std::vector<int>& getValues() const {return values;}
    std::vector<int>& getValues() {return values;}

    // And if you really want to move member, you may do
    std::vector<int> takeValues() {return std::move(values);}
private:
    std::vector<int> values;
};
类数据
{
公众:
const std::vector&getValues()const{return values;}
std::vector&getValues(){return values;}
//如果你真的想移动会员,你可以这样做
std::vector takeValues(){return std::move(values);}
私人:
std::向量值;
};
那么你可以用

Data d;
std::vector<int> v1;
std::vector<int> v2;
//...
v1 = d.getValues(); // copy
v2 = std::move(d.getValues()); // move
// Or alternatively:
v2 = d.takeValues(); // move
datad;
std::向量v1;
std::向量v2;
//...
v1=d.getValues();//复制
v2=std::move(d.getValues());//移动
//或者:
v2=d.takeValues();//移动

仅通过正常引用返回:

class Data
{
public:
    const std::vector<int>& getValues() const {return values;}
    std::vector<int>& getValues() {return values;}

    // And if you really want to move member, you may do
    std::vector<int> takeValues() {return std::move(values);}
private:
    std::vector<int> values;
};
类数据
{
公众:
const std::vector&getValues()const{return values;}
std::vector&getValues(){return values;}
//如果你真的想移动会员,你可以这样做
std::vector takeValues(){return std::move(values);}
私人:
std::向量值;
};
那么你可以用

Data d;
std::vector<int> v1;
std::vector<int> v2;
//...
v1 = d.getValues(); // copy
v2 = std::move(d.getValues()); // move
// Or alternatively:
v2 = d.takeValues(); // move
datad;
std::向量v1;
std::向量v2;
//...
v1=d.getValues();//复制
v2=std::move(d.getValues());//移动
//或者:
v2=d.takeValues();//移动


为什么首先要将类成员移动到对象外部?afaik移动会使“从对象移动”的对象处于不可用状态。不是我错了,就是搬家有点奇怪member@tobi303它处于未指定但有效的状态(您可以重用它)。我会首先通过
takeValues
@Timur重命名
getValues
,但对自己的脚开枪也是一种尝试。首先,为什么要将类成员移动到对象之外?移动会使移动自对象处于不可用状态。不是我错了,就是搬家有点奇怪member@tobi303它处于未指定但有效的状态(你可以重用它)。我会首先通过
takeValues
@Timur重命名
getValues
,但它也更容易让你射中自己的脚。很好。但是,如果出于安全考虑,我想要const reference
const std::vector&getValues(){return values;}
,该怎么办?@Timur您不能从
const
实例中移动,因为移动是一个修改过程。您有3种方法可以正确获取成员。我不确定你评论后想要什么。(在你的评论中,你的方法应该是
const
。@Jarod42。我想区分安全拷贝和不安全拷贝move@Timur:
std::move
是显式的,所以您很好。但是,如果出于安全考虑,我想要const reference
const std::vector&getValues(){return values;}
,该怎么办?@Timur您不能从
const
实例中移动,因为移动是一个修改过程。您有3种方法可以正确获取成员。我不确定你评论后想要什么。(在你的评论中,你的方法应该是
const
。@Jarod42。我想区分安全拷贝和不安全拷贝move@Timur:
std::move
是显式的,所以您可以。