Что значит "не наблюдаем"?
Он просто не вызывается.
Он оптимизирован.
Компилятор догадывается, что результат выражения
auto obj1 = foo(); //return some(param);
Будет аналогичен выражению:
Выпиливает создание временного объекта.
А для результирующего объекта заменяет вызов копирующего конструктора на explicit ctor
При этом, допустим мы почему то захотели что бы в копирующем конструкторе были эффекты. Например запрос в БД.
А в конструкторе с параметрами таких эффектов нет.
В этом случае получается, что компилятор выполняя такую оптимизацию нарушает ожидаемую нами логику: мы рассчитывали на запрос в БД, но после оптимизации его не случилось.
По стандарту компилятор не имеет право применять оптимизации, которые изменяют "фактическое" состояние программы настолько, что оно перестает соответствовать "логическому" (такому, которое изначально было описано в исходном коде).
Однако, следование этому правилу накорню обламывает множество важных оптимизаций связанных с копированием объектов.
Раньше компиляторы умели RVO/NRVO, но в большинстве случаев они оказывались недопустимыми из-за возможных эффектов.
Поэтому, стандарт их узаконил.
С этого момента, компиляторы были
обязаны поддерживать и использовать оптимизации RVO/NRVO.
в частности, выражение:
компилятор обязан оптимизировать до:
компилятор обязан оптимизировать до:
Для копирующих конструкторов была сделала оговорка.
Я точно не помню как она звучит в оригинале.
Я запомнил её в своём весьма вольном переводе:
нельзя закладываться на то, что копирующий конструктор будет наблюдаемый.
Всегда нужно иметь ввиду, что компилятор может выпилить копирования невзирая на содержимое копирующего конструктора.
Поэтому эффекты в конструкторе копирования - это ill-formed.
В хорошей программе они не допустимы.
(хотя функции с эффектами, это строго говоря само по себе ill-formed.
Ответ на вопрос "почему?" можно найти в книжках аля "Идеальный код" Макконелла)
MSVC 2012 в режиме Debug вызывает конструктор копирования (в этом году проверял)
msvc2012, тулсет: штатный из коробки, а так же ноябрьский. В дебаге оптимизирует копирование временных объектов.
msvc2013, тулсет: штатный из коробки, а так же ноябрьский. В дебаге оптимизирует копирование временных объектов.
гцц
http://rextester.com/XUAMR22459шланг
http://rextester.com/IOSR104272013 студия, ноябрь
http://rextester.com/BCN98402012 к сожалению не могу продемонстрировать на онлайн компиляторе.
Однако результат точно такой же. Я лично долбался с ним, пытаясь найти способ, как заставить компилятор не оптимизировать. Не нашел.