2013-06-01 2 views
9

Почему в этом примере ничего не печатается? Я собираюсь в Clang на Coliru.Почему конструктор move не вызван?

#include <iostream> 

struct S 
{ 
    S() noexcept = default; 
    S(S&&) noexcept { std::cout << "move-ctor"; } 
}; 

void f(S) {} 

int main() 
{ 
    f(S{}); 
} 
+0

Возможный дубликат [C++ 11 move constructor не вызывается, предпочтительный конструктор по умолчанию] (http://stackoverflow.com/questions/13099603/c11-move-constructor-not-called-default-constructor-preferred) – jogojapan

ответ

10

Компилятор выполняет копирования Пропуска, который разрешен в соответствии с пунктом 12.8/31 C++ 11 Standard четной, если ваш ход конструктор, конструктор копирования, или деструктор имеют побочные эффекты:

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

Термин копия элизия используется даже тогда, когда движение идет опущены:

Это элизия копирования/перемещения операций, называется копия элизия, допускается в следующих случаях (которые могут быть объединены для устранения нескольких копий ):

[...]

- когда объект временного класса, который не был привязан к ссылке (12.2), будет скопирован/перемещен объекту класса с тем же CV-неквалифицированным типом, операция копирования/перемещения может быть опущена , объект непосредственно в мишень опущенным копирования/перемещения

[...]

с GCC, вы можете использовать -fno-elide-constructors для подавления копирования Пропуска. В этом случае вы увидите, что вызывает конструктор перемещения, как в этом live example.

+0

Почему это называется копией, если я двигаюсь? – user2030677

+1

@ user2030677: Это стандартная терминология. В основном по историческим причинам (в C++ 03 можно было исключить только копии, поскольку семантика перемещения не существовала) –

+0

@ user2030677 вы возвращаете * копию *, которая могла быть выполнена с помощью конструктора копирования или конструктора перемещения копии. – juanchopanza

Смежные вопросы