Недавно я читал «внутри объектной модели c ++» и во время чтения главы 5 у меня возник следующий вопрос:
Будет ли компилятор обрабатывать NRVO, даже если у класса есть конструктор копирования?
Ответ: «Нет, это не помешает».
n3290 (черновик C ++ 11), книга 12, глава 8, стих 31 (p284):
При соблюдении определенных критериев реализация может опустить конструкцию копирования / перемещения класса.
объект, даже если конструктор копирования / перемещения и / или деструктор для объекта имеют побочные эффекты.
RVO (или NRVO) — это оптимизация того компилятора может быть использовать для исключения копий, т.е. предотвратить создание избыточных копий. Ваша пользовательская реализация конструктора копирования не может предотвратить применение этой оптимизации.
RVO более или менее создает объект в другой области видимости и использует этот объект вместо локального при чтении или записи переменных. Это приводит к тому, что создается только один объект и вообще не вызывается копия ctor, что делает его объявленным несущественным.
Я думаю, что ваш вопрос «если тривиальный конструктор копирования будет препятствовать nrvo»,
Мой ответ — нет.
Я использую случай в книге «внутри объектной модели c ++», пусть он печатает адрес члена в функции foo и в основной функции, результат показывает, что они одинаковы в режиме выпуска и отличаются в режиме отладки без оптимизм во вс 2010.
Это означает, что NRVO не заботится о том, есть ли у вас нетривиальный конструктор копирования или тривиальный.