繁体   English   中英

Lambda捕获初始化器对C ++ 11的警告

[英]lambda capture initializers warning for c++11

有这样的C ++代码:

auto func = [=, vec1=std::move(vec)]() {
                   printf("%x  %x  %x\n", p,vec1.data(), vec.data());
           };

当我使用-std=c++11进行编译时,编译器将显示warning

lambda capture initializers only available with -std=c++14 or -std=gnu++14

但是代码可以正确运行,因此我需要对warnning

所以我需要对此警告进行处理。

您应该修复代码,以便没有警告。

有两个选项:在允许使用lambda捕获初始化程序的C ++ 14模式或更高标准版本中进行编译,或者不使用vec1=std::move(vec) lambda初始化程序。

这些代码需要交叉编译,因此我需要考虑是否支持c ++ 14平台,这是一个历史问题,因此无法直接添加c ++ 14

因此,选择后者。 如果目标平台不支持C ++ 14功能,请不要使用它。

如果需要进入捕获,可以使用std::bind在C ++ 11中实现它:

auto func = std::bind(
    [=](const decltype(vec)& vec1) {
       printf("%x  %x  %x\n", p,vec1.data(), vec.data());
   },
   std::move(vec)
);

PS %x格式说明符要求参数为unsigned intstd::vector<T>::data的返回类型不是unsigned int ,而是T* ,因此行为将是不确定的。 %p用于指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM