错误:在 lambda 参数声明中使用 'auto' 仅适用于 -std=c++1y 或 -std=gnu++1y [-Werror]

Posted

技术标签:

【中文标题】错误:在 lambda 参数声明中使用 \'auto\' 仅适用于 -std=c++1y 或 -std=gnu++1y [-Werror]【英文标题】:error: use of 'auto' in lambda parameter declaration only available with -std=c++1y or -std=gnu++1y [-Werror]错误:在 lambda 参数声明中使用 'auto' 仅适用于 -std=c++1y 或 -std=gnu++1y [-Werror] 【发布时间】:2020-04-02 03:42:48 【问题描述】:

我有一个模板函数,可以将其放入输出流中,而不用担心类型。这是一个与 C++ 14 兼容的代码,它具有 auto 作为 lambda 的参数。但是,我需要我的编译器设置为 C++ 11。我要进行哪些更改来解决此问题,以便它也可以与 C++ 11 一起使用。

这是我的代码

template<class... Args >
std::string build_message( Args&&... args )


    auto aPrintImplFn = [](auto& os, auto&& ... ts) 
        // expression (void) just to suppress the unused variable warning
        (void)std::initializer_list<char>  (os << ts, '0')... ;
    ;

    std::ostringstream out;
    aPrintImplFn(out, std::forward<Args>(args)...);
    return out.str();

【问题讨论】:

拼出 lambda 参数:auto aPrintImplFn = [](std::ostringstream&amp; os,Args&amp;&amp; ... ts) ... 我想值得注意的是 aPrintImplFn 可以完全内联;我看不出有任何理由让它成为一个单独的函数。 【参考方案1】:

auto改为显式类型,如下

#include <sstream>
#include <string>
#include <iostream>
template<class... Args >
std::string build_message( Args&&... args )


    auto aPrintImplFn = [](std::ostringstream & os, Args&& ... ts) 
        // expression (void) just to suppress the unused variable warning
        (void)std::initializer_list<char>  (os << ts, '0')... ;
    ;

    std::ostringstream out;
    aPrintImplFn(out, std::forward<Args>(args)...);
    return out.str();

【讨论】:

以上是关于错误:在 lambda 参数声明中使用 'auto' 仅适用于 -std=c++1y 或 -std=gnu++1y [-Werror]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 lambda auto& 参数选择 const 重载?

lambda表达式传参

在可变参数模板中使用声明

在 C++11 中用“auto”推导时 lambda 的类型是啥?

在 QGraphicsScene 中拖动 QPixmap:如何避免 lambda 参数中不允许使用“自动”

C ++ 11将`auto` Lambda更改为不同的Lambda?