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