C ++使用xvalue(rvalue reference)作为左值

时间:2016-02-04 03:44:00

标签: c++ c++11 rvalue-reference armadillo xvalue

在下面的代码中,我有一个包含10个成员的大向量,可以分为4个子向量:

data[10]
P=data[0 to 2]
Q=data[3 to 5]
R=data[6 to 6]
S=data[7 to 9]

因为,vector R只有一个成员,所以我更喜欢直接从data返回一个rvalue。我想对这个值执行此操作:

x.R()=1983.2+x.R();

就像我可以用Q做的那样。但是,我收到了这个错误:

g++ -g -c main.cpp -std=c++11 -larmadillo -DNDEBUG
main.cpp: In member function ‘Super_vector::R_type&& Super_vector::R()’:
main.cpp:38:24: error: cannot bind ‘double’ lvalue to ‘Super_vector::R_type&& {aka double&&}’
         return data(6,6);
                        ^
main.cpp: In function ‘int main()’:
main.cpp:52:7: error: using xvalue (rvalue reference) as lvalue
  x.R()=1983.2+x.R();
       ^
make: *** [all] Error 1

的main.cpp

#include <armadillo>
#include <iostream>

using namespace std;

typedef arma::vec::fixed<10> x_vec;

class Super_vector
{
public:

    x_vec data;

    typedef decltype(std::declval<x_vec>().subvec(0, 2)) P_type;
    typedef decltype(std::declval<x_vec>().subvec(3, 5)) Q_type;
    typedef double R_type;
    typedef decltype(std::declval<x_vec>().subvec(7, 9)) S_type;

    Super_vector(x_vec data_) :
        data(data_)
    {
    }


    inline P_type P()
    {
        return data.subvec(0,2);
    }

    inline Q_type Q()
    {
        return data.subvec(3,5);
    }

    inline R_type&& R()
    {
        return data(6,6);
    }

    inline S_type S()
    {
        return data.subvec(7,9);
    }

};

int main()
{
    Super_vector x({2,3,5,7,11,13,17,19,23,29});
    x.Q()=-x.Q();
    x.R()=1983.2+x.R();
    x.data.print();

    return 0;
}

0 个答案:

没有答案