移动分配和引用成员

时间:2013-12-10 01:27:20

标签: c++ c++11 move-semantics

具有引用成员变量的类的复制赋值是禁止的,因为您无法重新分配引用。但是移动分配怎么样?我只是尝试move它,当然,当我只想移动引用本身时,它会破坏源对象:

class C
{
public:
    C(X& x) : x_(x) {}
    C(C&& other) : x_(std::move(other.x_)) {}
    C& operator=(C&& other)
    {
        x_ = std::move(other.x_);
    }
private:
    X& x_;
};

X y;
C c1(y);

X z;
C c2(z);

c2 = c1; // destroys y as well as z

我是否应该只实施移动分配并坚持使用移动构造?这使得swap(C&, C&)难以实施。

2 个答案:

答案 0 :(得分:17)

(作为OP建议的评论回复)

一般来说,如果一个人想要用C ++中的引用做一些非平凡的事情,那么就会使用reference_wrapper<T>,这对于T&来说基本上是一个奇特的价值语义替代,然后是将完成它 - 它已经提供(重新)任务和其他操作。我确信这会使移动构造函数和赋值变得非常平凡,如果不是微不足道的(请注意trivial并不像is_trivially_*语义)。

“引用包装器”作为TR1的一部分添加到C ++ 03中,是C ++ 11的一部分。

文档:http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper

答案 1 :(得分:0)

在某种意义上,参考是T *const,其中包含语法糖,可以自动降低反射,自动捕获和自动生命延长临时值。 (请注意,这不是真的,但通常是在实践和实践中)

如果你想要一个可重新引用的引用,C ++有:它们被称为指针。如果您愿意,可以使用访问器将取消引用替换为函数调用。难以模拟的剩余功能(临时终身扩展)不适用于struct成员。