Я не могу понять определение RVO (и NRVO) из-за множества вопросов, подобных этому, которые мне кажутся предполагающими что RVO опускает конструктор копирования. Теперь согласно 12.8.15
В таких случаях реализация рассматривает источник и цель пропущенной операции копирования просто как два разных способа обращения к одному и тому же объекту, и уничтожение этого объекта происходит в более позднее время, когда два объекта были бы уничтожены без оптимизация.
Похоже, что опущен не вызов конструктора копирования, а сама копия - просто объект создается в месте «копии» в первую очередь, и поэтому нет «исходного» объекта и вообще нет копирования. Таким образом, даже если у класса есть конструктор копирования private
, он может быть возвращен из функции, когда срабатывает RVO, потому что копии нет.
Я правильно понимаю? Опущено ли само копирование или опущен вызов конструктора копирования? Должен ли быть разрешен возврат объекта из функции, когда класс объекта имеет частный конструктор копии?