Конструктор копирования существует для создания копий. Теоретически, когда вы пишете строку вроде:
CLASS c(foo());
Компилятор должен вызвать конструктор копирования, чтобы скопировать возвращаемый результат foo()
в c
.
Копирование elision - это метод, позволяющий пропустить вызов конструктора копирования, чтобы не платить за накладные расходы.
Например, компилятор может договориться о том, что foo()
напрямую создаст свое возвращаемое значение в c
.
Вот еще один пример. Допустим, у вас есть функция:
void doit(CLASS c);
Если вы вызываете его с фактическим аргументом, компилятор должен вызвать конструктор копирования, чтобы исходный параметр не мог быть изменен:
CLASS c1;
doit(c1);
Но теперь рассмотрим другой пример, скажем, вы вызываете свою функцию следующим образом:
doit(c1 + c1);
operator+
собирается создать временный объект (значение). Вместо вызова конструктора копирования перед вызовом doit()
, компилятор может передать созданный operator+
временный файл и передать его doit()
.