在我使用所有编译器(g++/Linux、clang/Mac、msvc/Windows)的protobuf设置中看到了一个奇怪的问题。它的最小形式如下:
message A { // declare objA
int32 i;
}
message B { // declare objB
string s;
repeated bytes rb;
}
...
objA.CopyFrom(objB); // No compiler error?!
我以为CopyFrom()
(或MergeFrom()
)会出现编译器错误,比如“没有匹配的函数调用.”。但是它在所有环境中都很好!.pb.h中的方法声明看起来很好。它只希望输入A
。不过,它给出了其他非原型类型的编译器错误。
这是什么虫子吗?
发布于 2022-07-27 03:17:29
为什么CopyFrom() & MergeFrom()适用于每种消息类型?
因为有一个重载版本的CopyFrom
和MergeFrom
void CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final;
void MergeFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) final;
因为B
是从Message
派生的,所以没有编译器错误。
但是,如果试图复制或合并两种不同类型,运行时检查将失败,并引发异常。
[libprotobuf FATAL protobuf/src/google/protobuf/reflection_ops.cc:74] CHECK failed: (to->GetDescriptor()) == (descriptor): Tried to merge messages of different types (merge B to A)
libc++abi: terminating with uncaught exception of type google::protobuf::FatalException: CHECK failed: (to->GetDescriptor()) == (descriptor): Tried to merge messages of different types (merge B to A)
Abort trap: 6
为什么存在这些过载?
因为您可以使用protobuf反射动态创建一个真实类型为Message
的A
(反射接口返回基类,即Message
,而不是真实类型)。在这种情况下,您可以使用这些重载从动态生成的Message
复制或合并。
https://stackoverflow.com/questions/73119418
复制相似问题