在 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() &&
并且尾随&&
意味着该函数只能在右值上调用。由于h
是左值,他们使用std::move
将其转换回右值表达式,以便可以调用ack
。
【讨论】:
我对@987654321@ 的解释是,这是在语言级别上进行编码的一种尝试,即在给定实例上只应调用ack()
或nack()
中的一个。 IE。一旦你调用ack()
,对象就“消失”了。
弗兰克上面所说的。您只能拨打ack()
或nack()
,而且只能拨打一次。如果您执行std::move(h).ack(); std::move(h).ack();
之类的操作,某些编译器会警告您,而我们希望利用该警告。
@coryan FWIW, ack(std::move(h));
对于程序员来说会更直观。它清楚地表明“所有权”正在移交。以上是关于在 pubsub 中就地 std::move的主要内容,如果未能解决你的问题,请参考以下文章