为什么make_nvp需要非const引用?

时间:2017-08-18 08:28:55

标签: c++ boost boost-serialization

为什么非const引用?

template<class T>
const nvp< T > make_nvp(const char * name, T & t);

我问的原因是我有一个带有公共字段的结构,我需要将它们设为私有而是使用访问器。所以我想知道我是否允许使用临时变量并将它们传递给make_nvp,或者我需要将我的序列化器与数据结构联系起来。

// option 1
auto a = data.getA();
ar & make_nvp("A", a);

// option 2
ar & make_nvp("A", data._a); // _a is private, but serializer is friend

我不知道这是ar是什么,因为它是一个模板参数,因此在某些情况下,它可以使用这个非常量并保存以供以后使用,然后{{} 1}}是有问题的。

2 个答案:

答案 0 :(得分:3)

在boost存档中,您可以使用单个函数进行序列化和反序列化。这是通过使用存档作为模板参数来实现的 - 它可以是序列化结构的输出存档,也可以是从某个文件加载结构的输入存档。对于反序列化,函数需要一个非const引用来存储反序列化的值以及make_nvp需要非const引用的原因。

回到你的问题:选项2更有意义,因为选项1打破了反序列化。

答案 1 :(得分:0)

选项1可以打破对象跟踪,只要您不将任何指针序列化到data._a或它的内部,就可以了。