为什么make_nvp需要非常量参考?

Why make_nvp needs non-const reference?

本文关键字:非常 常量 参考 make nvp 为什么      更新时间:2023-10-16

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

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 破坏了反序列化。

选项 1 会中断对象跟踪,只要您不序列化任何指向data._a或其内部的指针

就可以了。