我想创建一个临时树(例如,作为某个表达式的参数给出)。要做到这一点,我不想分配内存,而是利用C ++功能来处理临时值和constexpr。
将使用类似于以下内容的语法内联创建树:
temporary_node<int> t(
n(111)({
n(222),
n(333)
})
);
根111
有两个孩子:222
和333
。
现在,因为我希望每个节点有一个可变数量的子节点,所以我使用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
但在此之后它只包含垃圾。
了解引擎盖下发生的事情?