C++11 конструктор перемещения с побочными эффектами
В C++ нельзя полагаться на конструктор копирования, вызываемый из оператора return, из-за специального предложения в стандарте, которое позволяет компилятору опустить вызов конструктора копирования, полученный из оператора return, даже если конструктор копирования имеет побочные эффекты. Таким образом, это плохой стиль для написания конструктора копирования, который делает что-то другое, чем просто копирование, создающее экземпляр.
Существуют ли аналогичные операторы в стандарте C++11, которые позволяют компилятору исключить a вызов конструктора перемещения при определенных обстоятельствах - и если да, то каковы эти обстоятельства?
3 ответа:
Copy-elision применяется точно так же к конструкции перемещения, это одно и то же предложение, и оба elision конструкции копирования и конструкции перемещения совместно называются "copy-elision".
§12.8 [class.copy] p31
При соблюдении определенных критериев реализации разрешается опустить конструкцию copy/move объекта класса, даже если конструктор copy/move и/или деструктор для объекта имеют побочные эффекты. [...]
Когда копирование elision разрешено, копирование не выполняется, поэтому не будет вызова конструктора move copy, даже если объект является перемещаемым. Таким образом, копирование elision побеждает перемещение, и вы не можете быть уверены (по крайней мере, не переносным способом), когда это произойдет. Так что это один из сценариев, когда побочные эффекты при создании копии перемещения были бы плохой идеей.