错误:在 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& os,Args&& ... 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 重载?
在 C++11 中用“auto”推导时 lambda 的类型是啥?