Почему стандарт позволяет моему компилятору применять elision copy, даже если он связан с видимыми побочными эффектами, что нарушает правило «как будто»?
Это как-то правдоподобно для меня, когда кто-то гарантирует исключение копирования, потому что фактическая функциональность для копирования / перемещения (которая вызовет видимые изменения в поведении программы) не обязательно должна существовать, но почему / как это было до C + +17?
Это потому, что компилятор не может вообще обнаружить побочные эффекты (я не знаю, возможно ли это)?
Случаи, которые допускают эту оптимизацию, включают копии временных. Концептуально, они не должны иметь видимого эффекта, но язык позволяет авторам классов помещать все, что они хотят, в конструктор копирования.
Таким образом, конструкторы копирования иногда могут иметь видимые побочные эффекты. Строго говоря, правило «как будто» может быть неприменимо.
Считалось, что эта оптимизация была достаточно полезной, а вред — минимальным, чтобы его можно было включить в язык. Учтите, что эта оптимизация предшествует перемещению семантики, где возвращаемые значения всегда будут копироваться.
Доказывать вещи сложно, даже если они явно правдивы (правда ли они или нет). Включение компилятора для доказательства вещей в приемлемое время еще сложнее. А потом некоторые побочные эффекты может не иметь никакого значения, но как бы вы сообщили компилятору?
Хотя копирование должен не нарушать правило «как будто» (по крайней мере, если компилятор знал, какие побочные эффекты следует игнорировать при анализе), программист может свободно писать свои типы, так что он делает это в любом случае.
Наконец, невозможность доказать, что применение copy-elision не нарушает правило «как будто» в конкретном случае, может быть очень дорогостоящим, поскольку создание копии объекта может быть произвольно связано с необходимостью времени и пространства.
Таким образом, copy-elision была сделана как исключение из правила «как если бы», которое было разрешено независимо.
Теперь, что касается гарантированного копирования, нужно признать, что правила не обязательно являются полностью очевидными. Таким образом, это хорошо, что полагаться на это только (?) необходим для производительности, а не для корректности, по крайней мере там, где требования к производительности не слишком строги.