2012-07-03 2 views
2

У меня есть функция, которая выглядит примерно так, он возвращает noncopyable класс по movesemantics:Деструктор, вызываемый перед move-constructor?

MyClass&& MyFunction() { 
    MyClass myClass; 
    do some stuff; 
    return std::move(myClass); 
} 

А потом это доступ

main() { 
    MyClass myClass = MyFunction(); 
} 

Класс использует boost::noncopyable для copyprevention. Он имеет конструктор, конструктор перемещения и назначение перемещения. Моя проблема заключается в том, что деструктор вызывается перед конструктором перемещения. Что я сделал не так?

ответ

4

Вы возвращаете ссылку на локальную переменную. Не имеет значения, является ли это ссылкой на lvalue или ссылкой rvalue.

Вы, вероятно, нужно просто сделать

MyClass MyFunction() { 
  MyClass myClass; 
  do some stuff; 
  return myClass; 
} 

и пусть фигурку компилятор, как скопировать или переместить результат.

+0

Я думал, что вы явно возвратили rvalues. –

+0

Да, это ожидалось на ранней стадии. Позже выяснилось, что это не совсем так. См. [Хотите скорость? Перейдите по значению] (http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/). –

+1

В этом случае компилятор всегда будет перемещать 'myClass'. – Puppy

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