LINUX.ORG.RU

История изменений

Исправление fsb4000, (текущая версия) :

@eao197 да, верно, std::vector::operator[] возвращает vector<bool>::reference который является прокси-объектом, который может приводиться к bool, и там хранится ссылка на локальный контейнер, который уже будет уничтожен по выходу из функции.

Это именно только vector<bool> так работает, из-за того что он проектировался для экономии памяти.

Ну и пофиксить тоже тривиально, нужно заменить auto на T.

#include <vector>

template <typename T>
constexpr T f(const T &value) {
    std::vector<T> vec(1, value);
    return vec[0];
}

static_assert(f(true));

https://en.cppreference.com/w/cpp/container/vector_bool

Исходная версия fsb4000, :

@eao197 да, верно, std::vector::operator[] возвращает vector<bool>::reference который является прокси-объектом, который может приводиться к bool, и там хранится ссылка на локальный контейнер, который уже будет уничтожен по выходу из функции.

Это именно только vector<bool> так работает, из-за того что он проектировался для экономии памяти.

Ну и пофиксить тоже тривиально, нужно заменить auto на T.

#include <vector>

template <typename T>
constexpr T f(const T &value) {
    std::vector<T> vec(1, value);
    return vec[0];
}

static_assert(f(true));