От cppreference,
Когда происходит удаление копии, реализация обрабатывает источник и
цель пропущенной операции копирования / перемещения (начиная с C ++ 11) просто как два
различные способы обращения к одному и тому же объекту, а также уничтожение
этот объект возникает в более поздние времена, когда два объекта
был бы уничтожен без оптимизации (за исключением того, что если
Параметр выбранного конструктора является ссылкой на значение
тип объекта, уничтожение происходит, когда цель была бы
уничтожено) (начиная с C ++ 17).
Для простого случая, как A a = returnA();
Я могу понять, что объект не разрушен в returnA()
и вместо этого происходит разрушение, как в случае A a;
который позже.
Я не могу вспомнить случай, когда происходит обратное, так что источник операции копирования / перемещения уничтожается первым. Также я хотел бы получить пример добавленной инструкции начиная с C ++ 17 (исключение, когда параметр выбранного конструктора является rvalue ссылкой на тип объекта)
Симметричный случай, когда источник переживает цель, это когда параметр 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 (наряду с гарантией такого исключения) заключается в том, что если вы (будете) переехать Значение параметра prvalue может быть уничтожено, когда параметр имеет значение (поскольку в любом случае вы не должны полагаться на его содержимое). Если это когда f
возвращается, (опрометчивый) код выше становится недействительным, если A
сделан подвижным
Других решений пока нет …