在 yaml-cpp 中保存节点引用

Posted

技术标签:

【中文标题】在 yaml-cpp 中保存节点引用【英文标题】:hold node reference in yaml-cpp 【发布时间】:2015-08-19 00:22:12 【问题描述】:

当我使用 yaml-cpp 库运行以下代码时:

YAML::Node node1 = YAML::Load(" hello: [item1, item2] ");
YAML::Node node2 = node1;

node1 = node1["hello"];

std::cout << node2 << "\n";
std::cout << node1 << "\n";

我最终得到了包含在 node1node2 变量中的相同节点。在这两种情况下,它都会打印[item1, item2]。这是正确的行为还是搞砸了?我想知道如何在原始节点上保留参考? 如果重要的话,我使用 g++ 5.1.0 和 boost 1.59.0。

【问题讨论】:

【参考方案1】:

yaml-cpp 中的节点是引用类型,不是值类型;但这并没有始终如一地实施。请参阅项目页面上的this issue,其中突出显示了这个问题。

在你的具体情况下,当你写

YAML::Node node2 = node1;

它使这两个引用指向相同的值;也就是说,你对一个人所做的任何事情都会反映在另一个人身上。

那么,当你写的时候

node1 = node1["hello"];

它做了两件事:首先,node1["hello"] 拉出(引用)node 中的"hello" 键,即[item1, item2]。接下来,它将这个分配给node1

这就是 API 实现有些不一致的地方。由于operator= 被处理为引用语义,这会将node1 引用的 设置为被替换。由于node2node1 的别名,它的值也被替换了。

【讨论】:

以上是关于在 yaml-cpp 中保存节点引用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 yaml-cpp 中合并节点

yaml-cpp:创建一个未定义的节点

在 yaml-cpp 中按名称删除节点

如何确定yaml-cpp中节点的内置标签?

你如何确定你在 yaml-cpp 中处理啥样的节点?

如何为特定的 yaml-cpp 节点设置发射样式