# 用赋值代替 protobuf CopyFrom()
示例:[Replace protobuf CopyFrom with assignment](https://github.com/tensorflow/tensorflow/commit/9501c4104125fb8c2c2d2e837fc2dd8a24034d52)
protobuf 生成的 C++ 代码中,因为 CopyFrom() 可以接受任何 Message 作为参数,
所以有可能在2个不同类型的消息之间复制。
```
void CopyFrom(const ::google::protobuf::Message& from) final;
void CopyFrom(const PlayerData& from);
```
而赋值操作可以保证类型正确。
```
class PlayerData : public ::google::protobuf::Message {
public:
...
inline PlayerData& operator=(const PlayerData& from) {
CopyFrom(from);
return *this;
}
#if LANG_CXX11
inline PlayerData& operator=(PlayerData&& from) noexcept {
...
}
#endif
```
类型不一致时编译会报错:
```
error: no match for ‘operator=’ (operand types are ‘a::PlayerData’ and ‘a::HeroInfo’)
```
发现自己用了多年的 CopyFrom() 都是错误的使用。![]()
示例:[Replace protobuf CopyFrom with assignment](https://github.com/tensorflow/tensorflow/commit/9501c4104125fb8c2c2d2e837fc2dd8a24034d52)
protobuf 生成的 C++ 代码中,因为 CopyFrom() 可以接受任何 Message 作为参数,
所以有可能在2个不同类型的消息之间复制。
```
void CopyFrom(const ::google::protobuf::Message& from) final;
void CopyFrom(const PlayerData& from);
```
而赋值操作可以保证类型正确。
```
class PlayerData : public ::google::protobuf::Message {
public:
...
inline PlayerData& operator=(const PlayerData& from) {
CopyFrom(from);
return *this;
}
#if LANG_CXX11
inline PlayerData& operator=(PlayerData&& from) noexcept {
...
}
#endif
```
类型不一致时编译会报错:
```
error: no match for ‘operator=’ (operand types are ‘a::PlayerData’ and ‘a::HeroInfo’)
```
发现自己用了多年的 CopyFrom() 都是错误的使用。