针对c ++ 11的lambda capture初始化器警告

sun*_*ndq 0 c++ c++11 c++14

有这样的c ++代码:

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

当我编译它时-std=c++11,编译器打印warning

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

但代码可以正常运行,所以我需要处理它warnning.

eer*_*ika 6

所以我需要处理这个警告.

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

有两个选项:在C++ 14模式或更高版本的标准版本中编译,其中允许使用vec1=std::move(vec)lambda 捕获初始化程序,或者不使用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)
);
Run Code Online (Sandbox Code Playgroud)

PS %x格式说明符要求参数为unsigned int但返回类型std::vector<T>::data不是unsigned int,但是T*,因此行为将是未定义的.%p是指针.