Кажется, что основной совет относительно С++ 0x rvalues - добавить конструкторы перемещения и переместить операторы в ваши классы, пока компиляторы не будут использовать их по умолчанию.
Но ожидание - это проигрышная стратегия, если вы используете VC10, потому что автоматическая генерация, вероятно, не будет здесь до VC10 SP1, или в худшем случае, VC11. Вероятно, ожидание этого будет измеряться годами.
Вот моя проблема. Написание всего этого повторяющегося кода не является забавным. И это неприятно смотреть. Но это бремя, хорошо принятое, потому что эти классы считаются медленными. Не так для сотен, если не тысяч, меньших классов.
:: sighs:: С++ 0x должен был позволить мне писать меньше кода, а не больше!
И тогда я подумал. Я бы предположил, что меня разделяют многие.
Почему бы просто не передать все по стоимости? Не будет ли std:: move + copy elision сделать это почти оптимальным?
Пример 1 - Типичный конструктор Pre-0x
OurClass::OurClass(const SomeClass& obj) : obj(obj) {}
SomeClass o;
OurClass(o); // single copy
OurClass(std::move(o)); // single copy
OurClass(SomeClass()); // single copy
Минусы: Пропущенная копия для rvalues.
Пример 2 - Рекомендуемый С++ 0x?
OurClass::OurClass(const SomeClass& obj) : obj(obj) {}
OurClass::OurClass(SomeClass&& obj) : obj(std::move(obj)) {}
SomeClass o;
OurClass(o); // single copy
OurClass(std::move(o)); // zero copies, one move
OurClass(SomeClass()); // zero copies, one move
Плюсы: Предположительно самый быстрый.
Минусы: Много кода!
Пример 3 - Пошаговое значение + std:: move
OurClass::OurClass(SomeClass obj) : obj(std::move(obj)) {}
SomeClass o;
OurClass(o); // single copy, one move
OurClass(std::move(o)); // zero copies, two moves
OurClass(SomeClass()); // zero copies, one move
Плюсы: Нет дополнительного кода.
Минусы: Впустую движение в случаях 1 и 2. Производительность сильно пострадает, если SomeClass
не имеет конструктора перемещения.
Как вы думаете? Это верно? Понесённый понесёт общеприемлемую потерю по сравнению с преимуществом сокращения кода?