Я проверил переместить конструктор спецификация и Конструктор сообщений Источник так и не нашел.
Если нет, кто-нибудь знает о плане, чтобы добавить его?
я использую proto3
синтаксис, написание библиотеки и рассмотрение между возвратом через значение против unique_ptr.
Начиная с версии 2.6.1, компилятор protobuf C ++ генерирует только конструкторы копирования и операторы назначения копирования. Но если ваш компилятор поддерживает оптимизация возвращаемого значения (и условия для этого соблюдены) конструктор копирования не будет вызван в любом случае.
Вы можете добавить некоторые операторы печати в сгенерированный код конструкторов копирования ваших сообщений, чтобы увидеть, действительно ли они вызваны или нет. Вы также можете сделать это, написав плагин Protoc, чтобы он сохранялся между вызовами Protoc.
В соответствии с https://github.com/google/protobuf/issues/2791 это будет поддерживаться в версии Protobuf 3.4.0.
Если вы попытаетесь использовать оператор присваивания, RVO выполнит оптимизацию, чтобы предотвратить дополнительное копирование.
// RVO will bring the return value to a without using copy constructor.
SomeMessage a = SomeFooWithMessageReturned();
Если вы хотите использовать std::move
переместить lvalue в список / вложенное сообщение и т. д. Попробуйте использовать ConcreteMessage::Swap
метод. Поменянный предмет будет бесполезен.
// Non-copy usage.
somemessage.add_somerepeated_message()->Swap(&a);
somemessage.mutable_somesinglar_message()->Swap(&a);
// With message copying
somemessage.add_somerepeated_message()->CopyFrom(a);
*somemessage.mutable_somesinglar_message() = a;