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

时间:2014-02-14 14:46:48

标签: c++ protocol-buffers mutable

我是google protobuf的新手,知道以下方法有什么不同之处:

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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