Правило разрешения копии основано на ISO C++ 12.8. В то время как другие правила, используемые в целом для оптимизации, в совокупности называются правилом «как-если» в разделе 1 (который позволяет реализации генерировать программу по-разному с «неоптимизированной» семантикой программы на основе модели абстрактной машины), это правило что вы можете относиться к «оптимизированному» коду, ведет себя так же точно, как и исходное значение. Другими словами, вызванные вызовы конструктора могут вообще не существовать в поведении абстрактной машины.
Если нет неопределенного поведения, с или без оптимизации в соответствии с как если бы правилами, наблюдаемого поведением оптимизированной программы и неоптимизированных программ должно быть одинаковыми (хотя они могут отличаться от производительности, и т.д.) , Однако копирование элиции более агрессивное, а именно, оно может изменить наблюдаемое поведение.
Лучше не полагаться на различия, возникающие при копировании. Таким образом, разумно придерживаться такого же поведения для обычных опций оптимизации и предоставлять отдельный вариант для контроля точного (различного) поведения для пользователей, которые хорошо знают риски и действительно нуждаются в этом.
WG21/N4296
1,9 Выполнение программы
5 Соответствующая реализация выполняет хорошо сформированную программу должен производить один и тот же наблюдаемое поведение в качестве одного из возможных выполнений соответствующего экземпляра абстрактная машина с той же программой и тот же ввод. Тем не менее, если какое-либо такое исполнение содержит неопределенную операцию, этот международный стандарт не требует от реализации выполнения этой программы с этим вводом (даже не в отношении операций, предшествующих первой неопределенной операции).
8 Наименее требования в соответствующей реализации является:
(8,1) - Доступ к летучим объектам оцениваются строго в соответствии с правилами абстрактной машины.
(8.2) - При завершении программы все данные, записанные в файлы, должны быть идентичны одному из возможных результатов, которые должно было выполнить выполнение программы в соответствии с абстрактной семантикой.
(8.3) - Динамика входных и выходных сигналов интерактивных устройств должна происходить таким образом, чтобы выводить вывод , прежде чем программа ждет ввода. Что представляет собой интерактивное устройство является реализацией.
Все эти данные обозначаются как наблюдаемое поведение программы. [Примечание. Более строгие соответствия между абстрактной и фактической семантикой могут быть определены каждой реализацией. -end примечание]
12,8 Копирование и перемещение объектов класса
31 При соблюдении определенных критериев, реализация может пропустить копирование/перемещение строительство объекта класса , даже если конструктор выбран операция копирования/перемещения и/или деструктор объекта имеют побочные эффекты. В таких случаях реализация рассматривает источник и цель пропущенной операции копирования/перемещения как просто два разных способа обращения к одному и тому же объекту, а уничтожение этого объекта происходит в более поздние моменты времени, когда два объекта были уничтожены без optimization.122 Это элизия копирования/перемещения операций, называется копия элизия, допускается в следующих случаях (которые могут быть объединены, чтобы исключить несколько копий):
...
Как вы определяете, был ли вызван конструктор копирования? –
Я переписываю конструктор копий и журнал под названием – jiafu
. Я предполагаю, что в каком-то месте g ++ делает постоянное сгибание/распространение - может быть в интерфейсе. И я думаю, вы не можете отключить это. – JohnTortugo