Компиляторы умные.Действительно умный.В этом случае есть оптимизация, называемая «копирование, удаление».Стандарт C ++ позволяет компилятору опускать копию, когда временный объект используется для инициализации объекта того же типа, а конструктор копирования указанного объекта не имеет побочных эффектов.
Это тот же класс оптимизаций, что и более популярное правило "как будто".Это правило позволяет компилятору обходиться без всего, что ему нужно, до тех пор, пока наблюдаемое поведение результирующей программы будет таким же, «как если бы», стандарт точно соблюдался.
Вот пример программы.На gcc 4.4.5 с обоими -O0 и -O3 этот код приводит к печати «1».Я думаю, что GCC здесь не так ... некоторые компиляторы будут выводить «2», указывая, что копия произошла.Это то, где вещи становятся хитрыми при попытке обнаружить поведение, которое должно быть необнаружимым.В одном из этих компиляторов единственный способ определить это - погрузиться в получившуюся сборку.
#include <iostream>
struct elision
{
explicit elision(int i) : v(i) {
}
elision(elision const ©) : v(copy.v+1) {
}
int v;
};
int main()
{
elision e(elision(1));
std::cout << e.v << std::endl;
return 0;
}