调用 .mutable_mynestedmsg() 和 .mynestedmsg() 之间有什么区别吗?

Is there any diff between call .mutable_mynestedmsg() and .mynestedmsg()?

本文关键字:mynestedmsg 什么 区别 mutable 调用 之间      更新时间:2023-10-16

我是谷歌protobuf的新手,需要知道以下方法之间有什么区别:

1) 
foo.mutable_bar()->set_somefield(...)

2)
nestedmsg = foo.bar(); 
nestedmsg.set_somefield() (where bar is message) 

正如我发现 foo.bar()对我不起作用。文档中的不同之处在于可变调用返回指针而不是default_instance。但是为什么第二种方法不起作用?

你的第二个版本甚至不应该编译:bar()返回一个常量引用,但set_somefield()不是常量方法。 不要使用const_cast来解决这个问题!

这些方法之间的区别在于,如果bar字段尚不存在,mutable_bar()实际上会使用新的子消息初始化该字段。 也就是说,如果has_bar()总是在mutable_bar()之后返回true,即使它事先false。 另一方面,bar()从不修改消息,因此不会影响has_bar()。 如果未设置bar字段,则bar()返回对该类型默认实例的引用,您永远不应修改该实例 - 这就是它是 const 的原因。

如果需要修改子消息,则必须始终使用 mutable_ 变体。 别担心,它永远不会返回空指针。