为什么 protobuf::message::GetMessage return 引用?

Why does protobuf::message::GetMessage return a reference?

看消息反射的protobuf接口,好像有两个函数:GetMessageMutableMessage。天真地认为,前者只是后者的 const 变体。然而,由于前者返回的是引用而不是指针,因此这两个函数似乎做了不同的事情。可悲的是,我还找不到任何关于两者之间概念差异的深入文档。

有谁知道并能详细说说吗?

前者实际上只是后者的 const 版本,除了未设置字段的情况(尚未):在这种情况下,GetMessage returns a默认值和 MutableMessage 一个新分配的实例。

返回 const 引用这一事实突出表明此方法从不 returns nullptr。而且这样生成的API也是一致的。

一个使用引用另一个使用指针的原因是 Google C++ Style Guide specifies that references must always be const,指针应该用于可变对象(即使指针不允许为空)。这纯粹是风格问题。一种思考方式是,通过 const 引用传递就像通过复制传递的优化版本:语法看起来相同,语义非常相似,但您避免了实际的复制步骤。

(也就是说,作为您所说的代码的作者,我个人不喜欢这条规则。)

Stefan Haustein 是正确的,GetMessage() 可以 return 默认值,而 MutableMessage() 确保消息已初始化,但这与 reference/pointer 差异无关。