Побочный эффект / Летучий / Копировать Конструктор / Деструктор - PullRequest
1 голос
/ 31 августа 2010

Со ссылкой на обсуждение здесь

$ 3.7.1 / 2 - "Если объект статической длительности хранения имеет инициализацию или деструктор с побочными эффектами, он не должен быть устранен дажеесли он, кажется, не используется, за исключением того, что объект класса или его копия могут быть удалены, как указано в 12.8. "

$ 12.8 / 15-" Когда определенные критерии выполнены, реализация может опустить конструкцию копииобъекта класса, даже если конструктор копирования и / или деструктор для объекта имеют побочные эффекты. "

Это вышеупомянутый случай, конкретные примеры случая, когда даже энергозависимое чтение / запись также может быть оптимизированопрочь (например, если у конструктора копирования есть чтение / запись в энергозависимую переменную).

Таким образом, вопрос в том, может ли конструктор копирования быть исключен, даже если конструктор копирования имеет чтение / запись энергозависимой переменной?«

Ответы [ 2 ]

0 голосов
/ 31 августа 2010

Иногда.Забавно, что вы спросите, потому что что-то, о чем я неправильно вспомнил о volatile (о котором говорил Иоганн), заставило меня посмотреть именно на такие мелочи.в операторе return в функции с типом возврата класса, когда выражение является именем энергонезависимого автоматического объекта с тем же типом cv-unqualified, что и тип возврата функции, операция копирования может быть опущена путем создания автоматического объектанепосредственно в возвращаемое значение функции

Итак, все в порядке, чтобы исключить доступ volatile путем исключения конструктора, но только если объект whole является энергозависимым.

Кроме того, он может изменить ситуацию, если функция вернет volatile foo по значению , в отличие от простого foo, потому что конструкция временного временного элемента не может быть исключена!

foo factory_a(); // return class by value
const foo factory_b(); // also return by value: rather pointless
volatile foo factory_c(); // implies no elision

Обратите внимание, что квалификация cv возвращенного временного объекта также влияет на семантику доступа временного объекта, например, factory_b().non_const_method() недопустимо.Так что это все более загадочно, чем с головой.

0 голосов
/ 31 августа 2010

NRVO допускается только в том случае, если именованный объект является энергонезависимым [это право в том же разделе, который вы цитировали, первый маркер], но в остальном я не вижу, почему нет.В конце концов, если объект, который вы создаете, является изменчивым, вы все еще пишете в него, вы просто не делаете это через конструктор копирования.И он не определяет, какие побочные эффекты он может игнорировать, поэтому ясно, что если изменяемое чтение / запись находится внутри самого конструктора копирования, компилятору это не нужно заботиться.

...