临时树完全在堆栈上

时间:2018-02-25 19:10:43

标签: c++ stack optional initializer-list temporary-objects

我想创建一个临时树(例如,作为某个表达式的参数给出)。要做到这一点,我不想分配内存,而是利用C ++功能来处理临时值和constexpr。

将使用类似于以下内容的语法内联创建树:

temporary_node<int> t(
    n(111)({
        n(222),
        n(333)
    })
);

111有两个孩子:222333。 现在,因为我希望每个节点有一个可变数量的子节点,所以我使用std::initializer_list模仿变量参数函数(为了不使用模板vararg或旧的<cstdarg>库(如建议{{ 3}})。

#include <initializer_list>
#include <iostream>
#include <optional>
using namespace std;

// my node type
template <typename T>
struct temporary_node {
    T value;
    std::optional<std::initializer_list<temporary_node<T>>> children;
    temporary_node(int value) : value(value), children() {}
    temporary_node operator()(std::initializer_list<temporary_node<T>> children) {
        this->children = children;
        return *this;
    }
    std::string print() const {
        std::string result = std::to_string(value); // the problem is here
        if (children.has_value()) {
            result += "(";
            for (auto& child : children.value()) {
                result += child.print() + ", ";
            }
            result += ")";
        }
        return result;
    }
};

// a simple function that generates a node
template <typename T>
temporary_node<T> n(T value) {
    return {value};
}

// program
int main() {
    temporary_node<int> t(
        n(111)({
            n(222),
            n(333)
        })
    );
    cout << t.print() << endl;
    return 0;
}

只需复制过去并使用c ++ 17构建。 该程序将打印&#34; 111(some_garbage,333,)&#34;。问题出在突出显示的行上。调用temporary_node(111)::printf后,temporary_node::value的读取会以某种方式破坏temporary_node::children

在调试器的帮助下,我在执行std::string result = std::to_string(value);之前立即验证,children正确包含222但在此之后它只包含垃圾。

了解引擎盖下发生的事情?

0 个答案:

没有答案