递归变量输出可编译,但在运行时出现段错误

时间:2019-01-10 15:33:13

标签: c++ recursion variant

所以我写了一个可以处理类似JSON内容的对象,其中有一个最小的例子:

#include <iostream>
#include <vector>
#include <variant> 

struct Array;
struct Value;

struct Array: public std::vector<Value>{
    using std::vector<Value>::vector;
};

struct Value: public std::variant<bool, int, Array>{
    using std::variant<bool, int, Array>::variant;
};

现在,我想重载输出流运算符。这是代码:

std::ostream& operator <<(std::ostream& os, const Value value);
std::ostream& operator <<(std::ostream& os, const Array array);

std::ostream& operator <<(std::ostream& os, const Array array){
    for (auto &a : array){
        os << a << ", ";
    }
    return os;
}
std::ostream& operator <<(std::ostream& os, const Value value){
    os << value;
    return os;
}

现在,如果我尝试运行它:

int main()
{
    Array a {1,2,3}; // OK
    std::cout << a;  // Segfault
}

渔获物在哪里?

编辑正如所指出的,存在一个递归循环。

1 个答案:

答案 0 :(得分:4)

由于无限递归,您的堆栈溢出:

std::ostream& operator <<(std::ostream& os, const Value value){
    os << value; // call to self
    return os;
}

这是将变体插入流中的正确方法:

std::visit([&](const auto& value) {
    os << value;
}, static_cast<const Value::variant&>(value));