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