拷贝版本(成员)函数与移动版本(成员)函数

来源:互联网 发布:linux mint 中文 编辑:程序博客网 时间:2024/05/17 00:58

拷贝版本(成员)函数与移动版本(成员)函数

通常,移动版本(成员)函数接受一个指向非const的右值引用,拷贝版本(成员)函数接受一个指向const的左值引用。

一般来说,我们不需要为(成员)函数定义接受一个const X&&参数或是一个普通的X&参数的版本:

  • 当我们希望从实际参数“窃取”数据时,通常传递一个右值引用,为了达到这一目的,实参不能是const的。

  • 类似的,从一个对象进行拷贝的操作不应该改变该对象,因此不需要定义一个接受一个普通的X&参数的版本。

具体代码见下一章。

引用限定符(reference qualifier)

在C++旧标准中,右值的使用方式可能会令我们惊讶:

string string1 = "a value";string string2 = "another";string1 + string2 = "wow"; //对一个string右值进行赋值

此处我们居然对一个右值进行了赋值!

C++11新标准希望在我们自己的类中避免这种使用方式(但为了维持向后兼容,新标准的标准库类仍然允许这种行为)。具体方法是:在参数列表后放置一个引用限定符。

引用限定符可以是&和&&,分别之处this可以指向一个左值或右值。

对于&限定的函数,我们只能将它用于左值。

对于&&限定的函数,我们只能将它用于右值。

class Foo{public:    Foo() = default;    Foo(int m, float n):a(m), b(n)    {    }    Foo &operator=(const Foo &object) & //只能用于左值    {        a = object.a;        b = object.b;        return *this;    }    void print() & //只能用于左值    {        cout << "just for test..." << endl;    }    int a;    float b;};Foo& retFoo(){    cout << "retFoo" << endl;    Foo t(1,1.2);    return t;}Foo retVal(){    cout << "retVal" << endl;    Foo t(1,1.2);    return t;}int main(){    Foo i, j;    i = j;    retFoo() = j;    i = retVal();    i.print();    retVal().print(); //error}
原创粉丝点击