Search code examples
yamlyaml-cpp

hold node reference in yaml-cpp


When I'm running following code with yaml-cpp library:

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

node1 = node1["hello"];

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

I end up with same node contained in both node1 and node2 variables. It prints [item1, item2] in both cases. Is it the right behavior or something is messed up? I'm wondering how can I keep reference at original node? I use g++ 5.1.0 and boost 1.59.0 if it matters.


Solution

  • Nodes in yaml-cpp are reference types, not value types; but this isn't implemented consistently. See this issue on the project page, which highlights this question.

    In your specific case, when you write

    YAML::Node node2 = node1;
    

    it makes these two references that refer to the same value; that is, anything you do to one be reflected in the other.

    Then, when you write

    node1 = node1["hello"];
    

    it does two things: first, node1["hello"] pulls out the (reference to) the "hello" key in node, which is [item1, item2]. Next, it assigns this to node1.

    This is where the API is somewhat inconsistently implemented. Since operator= is treated with reference semantics, this sets the value that node1 references as being replaced. Since node2 was an alias for node1, it, too, has its value replaced.