c++ - initializer_list 返回的生命周期延长

标签 c++ lambda return initializer-list auto

所以我有一个返回类型为 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 表达式作为单一语句作为其编码标准的一部分(请随意表达您的愤怒。)我认为我可以通过以下方式解决这个问题:

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

是否可以将这些变量强制放入一个容器中,其支持不会在一行中被全部销毁,这样我就可以将 lambda 保留为 auto返回类型?

最佳答案

图书馆基础知识 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}; };

关于c++ - initializer_list 返回的生命周期延长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37656076/

相关文章:

c++ - 逆时针插值一个角度?

Jquery every - 停止循环并返回对象

c++ - 在 QChart 上画一个点

c++ - 如何在 OGRE 中使用 SDL?

python - 为什么 Amazon Linux 上的 .so 文件比 OS X 上的大 5 倍?

java - 在参数中给定多个条件时过滤流

c - 这个函数中的 'else if' 是多余的吗?

bash - 如何突破源 Bash 脚本的功能

c++传递指针

c# - C# lambda/匿名委托(delegate)中的词法范围