C ++ 17 копирование elision и уничтожение объектов - PullRequest
0 голосов
/ 13 декабря 2018

Из cppreference ,

Когда происходит удаление копии, реализация обрабатывает источник и цель пропущенной операции копирования / перемещения (начиная с C ++ 11) как дваразличные способы обращения к одному и тому же объекту, и уничтожение этого объекта происходит в более поздние времена, когда два объекта были бы уничтожены без оптимизации (за исключением того, что, если параметр выбранного конструктора является ссылкой на значение объекта)типа, уничтожение происходит, когда цель была бы уничтожена) (начиная с C ++ 17).

Для простого случая, подобного A a = returnA();, я могу понять, что объект не уничтожен в returnA() и вместо этого происходит разрушение, как в случае A a;, который является более поздним временем.

Я не могу вспомнить случай, когда происходит обратное, например, уничтожается источник операции копирования / перемещенияпервый.Также я хотел бы получить пример добавленной инструкции начиная с C ++ 17 (исключение, когда параметр выбранного конструктора является rvalue ссылкой на тип объекта)

1 Ответ

0 голосов
/ 14 декабря 2018

Симметричный случай, когда источник переживает цель, когда prvalue является параметром:

struct A {
  static int *data;
  A() {if(!refs++) data=new int(42);}
  A(const A&) {++refs;}  // not movable
  ~A() {if(!--refs) delete data;}
private:
  static int refs;
};
int A::refs,*A::data;
int* f(A) {return A::data;}
A returnA();
int returnInt() {return *f(returnA());} // ok

Поскольку результат returnA() является временным, его время жизни продолжается до конца return выражение полное выражение .Реализация может идентифицировать его с параметром f, но не может уничтожить его при возврате f, поэтому разыменование в returnInt допустимо.(Обратите внимание, что параметры могут выжить так долго в любом случае.)

Корректировка в C ++ 17 (наряду с гарантированным таким исключением) такова, что если вы () move значение, оно может быть уничтожено, когда параметр имеет значение (так как вы не должны полагаться на его содержимое в любом случае).Если в этот момент возвращается f, приведенный выше (опрометчивый) код становится недействительным, если A сделан подвижным.

...