Vector <int>фабрика с инициализацией не работает - PullRequest
2 голосов
/ 13 марта 2019

Я попытался создать фабрику векторов, которая создает вектор 1 значений указанного размера s, но не работает должным образом.

template<size_t s>
constexpr std::vector<int>& vector_factory()
{
    std::vector<int> v(s, 1);
    return v;
}


int main(int argc, char* argv[])
{
    constexpr size_t s = 10;
    std::vector<int> v1 = vector_factory<s>();
    std::vector<int> v2 = vector_factory<s>();
}

Я получаю ошибку во время выполнения из-за большой попытки выделения. Однако, если я попытаюсь реализовать его таким образом, он будет работать правильно.

constexpr size_t s = 10;
std::vector<int> v1(s, 1);
std::vector<int> v2(s, 1);

Что я делаю не так?

1 Ответ

9 голосов
/ 13 марта 2019

Ошибка времени выполнения не из-за большой попытки выделения, а из-за двух висячих ссылок.Сигнатура функции

constexpr std::vector<int>& vector_factory();

имеет две проблемы.Во-первых, он не компилируется, потому что std::vector не имеет конструктора constexpr.Во-вторых, вы должны вернуть объект по значению, а не по ссылке.Компиляторы должны даже предупредить вас об этой проблеме.Если вы измените вышеприведенное значение на

std::vector<int> vector_factory() { /* As before... */ }

, все должно работать как положено.

...