Рассмотрим следующий класс:
class A
{
public:
std::string field_a;
std::string field_b;
}
Теперь рассмотрим следующую конструкцию копии:
A a1(a2);
Конструкция копии будет надлежащим образом скопировать A
, несмотря на отсутствие явного конструктора копирования, поскольку конструкторы копирования для std::string
будут вызываться компилятором, сгенерированным неявным конструктором копии.
То, что я хочу знать, так же верно для конструкции перемещения?
EDIT: Тестирование здесь показывает, что:
A a2(std::move(a1));
Фактически это приведет к созданию копии, если только конкретный конструктор перемещения:
A( A && other ) : a(std::move(other.a)) {}
Определяется.
EDIT EDIT Я pinged Stephan T Lavavej и спросил его, почему VC 2012, кажется, не следует, что проект 12.8 состояний относительно неявного создания конструктора движения. Он был достаточно любезен, чтобы объяснить:
Это больше "функция еще не реализована", чем ошибка. VC в настоящее время реализует то, что я называю ссылками rvalue v2.0, где перемещение ctors/assigns никогда не генерируются неявно и никогда не влияют на неявное генерирование копий ctors/assigns. С++ 11 указывает значение rvalue ссылки v3.0, которые являются правилами, которые вы ищете.