Допустим, у нас есть класс с обычным конструктором:
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. Все мы знаем его судьбу.
Комментариев нет:
Отправить комментарий