lifeizer_list返回的生命周期扩展

Jon*_*Mee 6 c++ lambda return initializer-list auto

所以我有一个返回类型的lambda,auto我在initializer_list这里被销毁的阵列支持有问题:

const auto foo = [](const auto& a, const auto& b, const auto& c) { return {a, b, c}; };
Run Code Online (Sandbox Code Playgroud)

我会像这样使用lambda:

auto bar = foo(1, 2, 3);

for(const auto& i : bar) cout << i << endl;
Run Code Online (Sandbox Code Playgroud)

我正在工作的一项工作是编码标准的一部分,所有lambdas都是单一陈述(随意表达你的愤慨.)我认为我可以解决这个问题:

  1. 给出foo一个返回类型vector int,但这会弄乱它的通用性如何:const auto foo = [](const auto& a, const auto& b, const auto& c) -> vector<int> { return {a, b, c}; }
  2. 只需编写一个构造a vector<T>并返回它的模板化函数:template <typename T> vector<T> foo(const T& a, const T& b, const T& c){ return {a, b, c}; }

是否有可能将这些变量强制转换为容器,谁的支持不会在一行中被销毁,以便我可以保持lambda的auto返回类型?

eca*_*mur 3

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); };
Run Code Online (Sandbox Code Playgroud)

更一般地,构造函数的模板参数推导将允许您编写:

const auto foo = [](const auto& a, const auto& b, const auto& c) {
    return std::vector{a, b, c}; };
                      ^-- no template parameter required
Run Code Online (Sandbox Code Playgroud)

今天,您可以使用以下方法来模拟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}; };
Run Code Online (Sandbox Code Playgroud)