yaml - 在 yaml-cpp 中保存节点引用

标签 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 和 boost 1.59.0。

最佳答案

yaml-cpp中的节点是引用类型,而不是值类型;但这并没有得到一致实现。请参阅this issue在项目页面上,突出显示了这个问题。

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

YAML::Node node2 = node1;

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

然后,当你写

node1 = node1["hello"];

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

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

关于yaml - 在 yaml-cpp 中保存节点引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32084611/

相关文章:

python - 将 YAML 文件中的数据加载到 python 中的变量中

file-io - ansible include_if_exists

ruby-on-rails - ruby 包括?使用 YAML 数组

yaml - YAML 中的字符串插值

c++ - 如何在 OpenCV 中编辑/更新 YAML 文件?

c++ - 如何使用键而不是标量检索 map 节点?

go - 如果使用 import func,如何在控制台中获取 value 属性?

c++ - 在不违反信息隐藏的情况下重载流插入?

c++ - 如何从 yaml 文件中获取特定的类别名称?

gcc - 对 YAML::Load 的 undefined reference