在yaml-cpp中保存节点引用

时间:2015-08-19 00:22:12

标签: yaml yaml-cpp

当我使用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并提升1.59.0。

1 个答案:

答案 0 :(得分:1)

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

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

YAML::Node node2 = node1;

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

然后,当你写

node1 = node1["hello"];

它做了两件事:首先,node1["hello"]拉出"hello" node中的[item1, item2]键,即node1。接下来,它将其分配给operator=

这是API在某种程度上不一致的实现。由于node1使用引用语义处理,因此将设置为node2引用被替换。由于node1sum(count)的别名,因此它也会替换其值。