Номинально да, временный объект создается по умолчанию, а затем вызывается конструктор копирования, чтобы скопировать его в ваш объект t
.
Однако на практике копия может быть оптимизирована вне & mdash; даже при наличии побочных эффектов (вывод на консоль):
[n3290: 8.5/16]
: [..] В некоторых случаях реализация
разрешено исключить копирование, присущее этому
прямая инициализация путем непосредственного построения промежуточного результата
в объект инициализируется; см. 12.2, 12.8.
И (в сочетании с примером, приведенным в том же пункте):
[n3290: 12.2/2]
: [..] Реализация может использовать временный
для построения X (2) перед передачей его в f () с использованием копии X
конструктор; альтернативно, X(2)
может быть построено в пространстве
используется для хранения аргумента. [..]
Но конструктор копирования все еще должен существовать, даже если он не может быть вызван.
В любом случае, если вы компилируете с отключенными оптимизациями (или, с GCC, возможно -fno-elide-constructors
), вы увидите:
This is ctor
This is copy-ctor