当我使用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";
我最终得到了node1
和node2
变量中包含的相同节点。它在两种情况下都打印[item1, item2]
。这是正确的行为还是搞砸了?我想知道如何在原始节点保持引用?
如果重要的话,我使用g ++ 5.1.0并提升1.59.0。
答案 0 :(得分:1)
yaml-cpp中的节点是引用类型,而不是值类型;但这并没有始终如一地实施。请参阅项目页面上的this issue,其中突出显示了此问题。
在您的具体情况下,当您写
时YAML::Node node2 = node1;
它使这两个引用引用相同的值;也就是说,你对一个人做的任何事情都会反映在另一个人身上。
然后,当你写
node1 = node1["hello"];
它做了两件事:首先,node1["hello"]
拉出"hello"
node
中的[item1, item2]
键,即node1
。接下来,它将其分配给operator=
。
这是API在某种程度上不一致的实现。由于node1
使用引用语义处理,因此将值设置为node2
引用被替换。由于node1
是sum(count)
的别名,因此它也会替换其值。