【问题标题】:Why make_nvp needs non-const reference?为什么 make_nvp 需要非常量引用?
【发布时间】:2018-01-26 20:51:23
【问题描述】:

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

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 存档中,您可以使用单个函数进行序列化和反序列化。这是通过使用存档作为模板参数来实现的——它可以是序列化结构的输出存档或加载结构的输入存档。对于反序列化,函数需要一个非常量引用来存储反序列化的值,这就是为什么make_nvp 需要一个非常量引用。
  • @pschill 我喜欢你的评论。你可能想变成一个答案,我会接受它。

标签: c++ boost boost-serialization


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-13
      • 2022-01-18
      • 2022-06-09
      • 1970-01-01
      • 2018-06-01
      • 2012-06-29
      • 1970-01-01
      相关资源
      最近更新 更多