История изменений
Исправление 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));
Исходная версия 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));