initializer_list return 的生命周期延长
Lifetime Extension of a initializer_list return
所以我有一个 return 类型为 auto
的 lambda,我在支持 initializer_list
的数组支持方面存在问题,这里被销毁了:
const auto foo = [](const auto& a, const auto& b, const auto& c) { return {a, b, c}; };
我将像这样使用 lambda:
auto bar = foo(1, 2, 3);
for(const auto& i : bar) cout << i << endl;
我正在从事的一项工作的编码标准是所有 lambda 都是单个语句(请随意表达您的愤怒。)我认为我可以通过以下方式解决这个问题:
- 给
foo
一个 return 类型的 vector int
,但这搞砸了它的通用性:const auto foo = [](const auto& a, const auto& b, const auto& c) -> vector<int> { return {a, b, c}; }
- 只需编写一个构造
vector<T>
和 return 的模板化函数:template <typename T> vector<T> foo(const T& a, const T& b, const T& c){ return {a, b, c}; }
是否可以将这些变量强制到一个容器中,谁的支持不会在一行中被全部销毁,这样我就可以让 lambda 保持 auto
return 类型?
library fundamentals 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); };
更一般地说,template argument deduction for constructors 允许您编写:
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}; };
所以我有一个 return 类型为 auto
的 lambda,我在支持 initializer_list
的数组支持方面存在问题,这里被销毁了:
const auto foo = [](const auto& a, const auto& b, const auto& c) { return {a, b, c}; };
我将像这样使用 lambda:
auto bar = foo(1, 2, 3);
for(const auto& i : bar) cout << i << endl;
我正在从事的一项工作的编码标准是所有 lambda 都是单个语句(请随意表达您的愤怒。)我认为我可以通过以下方式解决这个问题:
- 给
foo
一个 return 类型的vector int
,但这搞砸了它的通用性:const auto foo = [](const auto& a, const auto& b, const auto& c) -> vector<int> { return {a, b, c}; }
- 只需编写一个构造
vector<T>
和 return 的模板化函数:template <typename T> vector<T> foo(const T& a, const T& b, const T& c){ return {a, b, c}; }
是否可以将这些变量强制到一个容器中,谁的支持不会在一行中被全部销毁,这样我就可以让 lambda 保持 auto
return 类型?
library fundamentals 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); };
更一般地说,template argument deduction for constructors 允许您编写:
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}; };