Важным моментом является то, что стандарт явно разрешает это, и это означает, что вы не можете предполагать, что побочные эффекты конструктора копирования будут выполняться, поскольку копии могут быть исключены. Стандарт требует, чтобы реализация copy-constructor имела copy-constructor семантику, то есть, как целое назначение генерации второго объекта, семантически эквивалентного в вашем домене оригиналу объект. Если ваша программа соответствует этому, то оптимизация не повлияет на программу.
С другой стороны, это правда, что это единственная ситуация, которую я могу себе представить, когда стандарт допускает разные видимые результаты от одной и той же программы в зависимости от того, что делает компилятор, но вам советовали не иметь побочные эффекты в вашем конструкторе копирования (точнее, вы не можете зависеть от точного количества выполненных копий).
Что касается того, стоит ли это того, да, это так. Во многих случаях копии довольно дороги (я намеренно игнорирую move-constructors в C ++ 11 из обсуждения). Рассмотрим функцию, которая возвращает vector<int>
, если копия не исключена, тогда требуется другое динамическое выделение, копирование всего содержимого вектора и затем освобождение исходного блока памяти, все три операции могут быть дорогими.
Кроме того, вы можете заставить пользователей изменить свой код для создания пустого объекта и передать его по ссылке, но это сделает код труднее для чтения.