Перемещение и задание

Копирование-присваивание для класса с переменной-членом-ссылочкой - нет-нет, потому что вы не можете переназначить ссылку. Но как насчет переадресации? Я просто попробовал 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

Должен ли я просто не выполнять переадресацию и приклеивание только с помощью move-construction? Это затрудняет реализацию swap(C&, C&).

Ответ 1

(Добавлено как ответ от комментария, предложенный OP)

В общем случае, если вы хотите сделать нетривиальный материал со ссылками в С++, вы бы использовали reference_wrapper<T>, который по существу является причудливым значением-семантическим представлением для T&, тогда можно было бы сделать он - он уже предоставляет (повторно) назначение и другие операции. Я уверен, что это сделает конструктор перемещения и назначение почти тривиальным, если не тривиальным (обратите внимание не на trivial как на семантику is_trivially_*).

"Ссылка обложки" добавляется в С++ 03 как часть TR1 и является частью С++ 11.

Документация: http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper

Ответ 2

Ссылка в каком-то смысле означает T *const с синтаксическим сахаром сверху, чтобы автоматически увеличивать время, автозахват и время автономного продления. (обратите внимание, что это не совсем так, но часто на практике и практичности)

Если вам нужна ссылка для повторного использования, у С++ есть такие: они называются указателями. Вы можете использовать аксессор для замены разыменования вызовом функции, если хотите. Оставшаяся функция (временное продление жизни), которую трудно подражать, не относится к членам struct.