在 pubsub 中就地 std::move

Posted

技术标签:

【中文标题】在 pubsub 中就地 std::move【英文标题】:In place std::move in pubsub 【发布时间】:2021-11-11 17:14:31 【问题描述】:

在 pubsub google 官方文档https://cloud.google.com/pubsub/docs/pull 我们可以找到这样的例子。

namespace pubsub = ::google::cloud::pubsub;
auto sample = [](pubsub::Subscriber subscriber) 
  return subscriber.Subscribe(
      [&](pubsub::Message const& m, pubsub::AckHandler h) 
        std::cout << "Received message " << m << "\n";
        std::move(h).ack();
        PleaseIgnoreThisSimplifiesTestingTheSamples();
      );
;

我很好奇这里为什么使用std::move。据我了解,std::move 所做的唯一事情就是将对象转换为右值。如果在这里使用它,我看不出有什么区别。如果有人能解释一下,我将不胜感激。

【问题讨论】:

【参考方案1】:

我不能告诉你为什么会这样,但是调用std::move 的原因是pubsub::AckHandler::ack 被声明为void ack() &amp;&amp; 并且尾随&amp;&amp; 意味着该函数只能在右值上调用。由于h 是左值,他们使用std::move 将其转换回右值表达式,以便可以调用ack

【讨论】:

我对@9​​87654321@ 的解释是,这是在语言级别上进行编码的一种尝试,即在给定实例上只应调用ack()nack() 中的一个。 IE。一旦你调用ack(),对象就“消失”了。 弗兰克上面所说的。您只能拨打ack()nack(),而且只能拨打一次。如果您执行std::move(h).ack(); std::move(h).ack(); 之类的操作,某些编译器会警告您,而我们希望利用该警告。 @coryan FWIW, ack(std::move(h)); 对于程序员来说会更直观。它清楚地表明“所有权”正在移交。

以上是关于在 pubsub 中就地 std::move的主要内容,如果未能解决你的问题,请参考以下文章

C++在终端文件中就地覆盖输出的方法

C++在终端文件中就地覆盖输出的方法

RPC 在 C 中就地更改值

何时在 Caffe 中使用就地层?

在熊猫中理解就地=真

apache beam PubSub 在普通 pubsub 客户端库中读取 withIdAttribute 的替代方案