定义lambda并捕获它会导致混淆编译器错误

时间:2018-12-19 17:09:19

标签: c++ c++14

尝试在对象的构造函数中定义捕获this的lambda时出现编译器错误。看起来像这样:

typedef int (*HANDLER)(char*, int);
struct Foo {
bool member;
Foo() {
     HANDLER h1 = [](char* one, int two)->int {
         return 0;         // fine
     };
     HANDLER h2 = [](char* one, int two)->int {
         member = false;   // error: 'this' was not captured - understood
         return 0;
      };
     HANDLER h3 = [this](char* one, int two)->int {
         member = false;   // ok now but other error as below
         return 0;
      };
   }
};

h1很简单,可以很好地编译。 h2无法编译,因为未捕获成员变量member。这也是有道理的。但是,当我向捕获中添加this以获得对member的访问权限时,我收到一条错误消息,我正在努力解析:

mcve.cpp: In constructor ‘Foo::Foo()’:
mcve.cpp:16:11: error: cannot convert ‘Foo::Foo()::<lambda(char*, int)>’ to ‘HANDLER {aka int (*)(char*, int)}’ in initialization
       };
       ^

这是在-std = c ++ 14上使用gcc 4.9.1,尽管在Mac上我收到clang-1000.11.45.5的错误。请注意,HANDLER函数指针typedef是我正在外部库中使用的东西。

0 个答案:

没有答案