Продление срока действия возврата initializer_list
Так что у меня есть лямбда, который возвращает тип auto
и у меня возникают проблемы с поддержкой массива для initializer_list
разрушается здесь:
const auto foo = [](const auto& a, const auto& b, const auto& c) { return {a, b, c}; };
Я буду использовать лямбду следующим образом:
auto bar = foo(1, 2, 3);
for(const auto& i : bar) cout << i << endl;
Работа, над которой я работаю, является частью их стандарта кодирования, согласно которому все лямбда-выражения являются отдельными утверждениями (не стесняйтесь выражать свое возмущение.)
- дающий
foo
тип возвратаvector int
, но это портит, как это красиво:const auto foo = [](const auto& a, const auto& b, const auto& c) -> vector<int> { return {a, b, c}; }
- Просто написание шаблонизированной функции, которая создает
vector<T>
и возвращает его:template <typename T> vector<T> foo(const T& a, const T& b, const T& c){ return {a, b, c}; }
Можно ли привести эти переменные в контейнер, поддержка которого не будет уничтожена в одной строке, чтобы я мог сохранить лямбду с auto
тип возврата?
1 ответ
Библиотека основ TS v2 имеет std::experimental::make_array
, что наверняка удовлетворит ваши требования:
#include <experimental/array>
const auto foo = [](const auto& a, const auto& b, const auto& c) {
return std::experimental::make_array(a, b, c); };
В более общем случае вычет аргументов шаблона для конструкторов позволит вам написать:
const auto foo = [](const auto& a, const auto& b, const auto& c) {
return std::vector{a, b, c}; };
^-- no template parameter required
Сегодня вы можете подражать этому, используя common_type
:
const auto foo = [](const auto& a, const auto& b, const auto& c) {
return std::vector<std::common_type_t<decltype(a), decltype(b), decltype(c)>>{a, b, c}; };