Рекурсивный вариант вывода компилируется, но segfault во время выполнения - PullRequest
0 голосов
/ 10 января 2019

Итак, я написал объект, который может обрабатывать 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 голосов
/ 10 января 2019

У вас переполнение стека из-за бесконечной рекурсии:

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));
...