Страницы

Поиск по вопросам

среда, 27 марта 2019 г.

В чем отличие & от && на примере конструктора копирования и конструктора переноса?

Допустим, у нас есть класс с обычным конструктором:
class SomeClass { int size; int *element; public: SomeClass(int i) { //обычный конструктор size = i; element = new int[size]; } };
И предположим, что я добавил туда конструктор копирования и конструктор перемещения (переноса):
SomeClass( SomeClass &&other ) { //конструктор перемещения size = other.size; element = other.element; other.size = 0; other.element = nullptr; }
SomeClass( SomeClass &other ) { //конструктор копирования size = other.size; element = other.element; other.size = 0; other.element = nullptr; }
int main() { SomeClass a1(5); SomeClass a2(a1); //вызов конструктора копирования SomeClass a3 = move(a1); //вызов конструктора переноса }
Здесь один нюанс: конструктор копирования не будет копировать, он тоже будет выполнять перенос.
В чем тогда отличие? Если фактически происходит одно и тоже. Code::Blocks выдает разницу в секунду. Думаю, тогда вопрос встает между использованием & и &&
Я знаю, что второе - это ссылка на r-value, и что она позволяет обратиться к ресурсам объекта. Но ведь в обоих случая создается новый объект. В чем тогда профит?


Ответ

Конструктор перемещения это чисто конвенциональная конструкция(так же как и конструктор копирования, собственно), поэтому никто не мешает делать в любом конструкторе всё, что заблагорассудится. Другое дело, что программист, использующий Ваш класс, будет ожидать перемещения от конструктора перемещения и никак не будет ожидать такого подвоха от конструктора копирования.
В том числе и поэтому, конструктор копирования всегда объявляется с константным аргументом, а не как у Вас. Ещё раз, конструкторы имеют свои названия исходя из того, что они делают по умолчанию(т.е. тогда, когда их генерирует компилятор). Соответственно, программист тоже должен делать так, как делается по умолчанию, а не придумывать реализацию, которая больше похожа на саботаж, чем на что-либо другое.
Исходя из всего вышесказанного: Ваш вопрос не имеет смысла.

Отличным примером перемещающего конструктора копирования является std::auto_ptr. Все мы знаем его судьбу.

Комментариев нет:

Отправить комментарий