为什么在这里非常量引用?

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,因为它是模板参数,因此在某些情况下,它可以利用此非常量性并将其保存以供以后使用,然后option 1便会出现问题。

最佳答案

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

回到您的问题:选项2更有意义,因为选项1可以消除反序列化。

09-07 06:11