本文介绍了从通用lambda - clang和gcc调用`this`成员函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 限时删除!! 问题:传递捕获此的通用lambda (到模板函数),并调用成员函数这个没有明确的 this-> 不能在gcc上编译。如果lambda不是通用的,或者如果lambda没有传递给任何其他函数,但是调用到位,它编译具有显式 this-> 。 Clang在所有情况下都很酷。 另一轮 clang vs gcc 的时间。谁是正确的? Wandbox示例 template< typename TF> void call(TF&& f) { f(1); } struct示例 { void foo(int){} void bar() { call([this](auto x){foo(x);}); } }; int main() {示例{}。 return 0; } li> bar() = call([this](auto x){foo(x);}); clang ++ 3.6+ 编译。 g ++ 5.2+ 使用 bar() = call([this](auto x){this-> foo(x);}); clang ++ 3.6+ 编译。 g ++ 5.2+ 编译 li> 使用 bar / code> = call([this](int x){foo(x);}); clang ++ 3.6+ 编译。 g ++ 5.2+ / ul> 使用 bar() = [this](auto x){foo(x); }(1); clang ++ 3.6+ 编译。 g ++ 5.2+ 编译。 为什么 this-> 仅在通用lambda的情况下才需要? $如果未将lambda传递给 call ,为什么 this-> 谁不符合标准?解决方案是一个gcc bug。来自[expr.prim.lambda]:With bar() = call([this](auto x){ this->foo(x); });clang++ 3.6+ compiles.g++ 5.2+ compiles.With bar() = call([this](int x){ foo(x); });clang++ 3.6+ compiles.g++ 5.2+ compiles.With bar() = [this](auto x){ foo(x); }(1);clang++ 3.6+ compiles.g++ 5.2+ compiles.Why is the this-> necessary only in the case of a generic lambda?Why is the this-> not necessary if the lambda isn't passed to call?Who is being non standard-compliant? 解决方案 This is a gcc bug. From [expr.prim.lambda]:Since in your example you capture this, the name lookup should include class members of Example, which should therefore find Example::foo. The lookup performed is identical to what would happen if foo(x) appeared in the context of the lambda-expression itself, that is if the code looked like:void bar(){ foo(x); // clearly Example::foo(x);}At least this bug has a very simple workaround as indicated in the question: just do this->foo(x);. 这篇关于从通用lambda - clang和gcc调用`this`成员函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 1403页,肝出来的..
09-06 08:45