C++11 конструктор перемещения с побочными эффектами


В C++ нельзя полагаться на конструктор копирования, вызываемый из оператора return, из-за специального предложения в стандарте, которое позволяет компилятору опустить вызов конструктора копирования, полученный из оператора return, даже если конструктор копирования имеет побочные эффекты. Таким образом, это плохой стиль для написания конструктора копирования, который делает что-то другое, чем просто копирование, создающее экземпляр.

Существуют ли аналогичные операторы в стандарте C++11, которые позволяют компилятору исключить a вызов конструктора перемещения при определенных обстоятельствах - и если да, то каковы эти обстоятельства?

3 6

3 ответа:

Copy-elision применяется точно так же к конструкции перемещения, это одно и то же предложение, и оба elision конструкции копирования и конструкции перемещения совместно называются "copy-elision".

§12.8 [class.copy] p31

При соблюдении определенных критериев реализации разрешается опустить конструкцию copy/move объекта класса, даже если конструктор copy/move и/или деструктор для объекта имеют побочные эффекты. [...]

Когда копирование elision разрешено, копирование не выполняется, поэтому не будет вызова конструктора move copy, даже если объект является перемещаемым. Таким образом, копирование elision побеждает перемещение, и вы не можете быть уверены (по крайней мере, не переносным способом), когда это произойдет. Так что это один из сценариев, когда побочные эффекты при создании копии перемещения были бы плохой идеей.

Elision определяется одинаково как для копирования, так и для перемещения. В стандарте нет какой-либо конкретной формулировки для move, потому что они определены одинаково.