对于以下代码:
struct B
{
void g()
{
[]() { B::f(); }();
}
static void f();
};
Run Code Online (Sandbox Code Playgroud)
g ++ 4.6给出错误:
test.cpp:在lambda函数中:
test.cpp:44:21:错误:这个lambda函数没有捕获'this'
(有趣的是,g ++ 4.5编译代码很好).
这是g ++ 4.6中的错误,还是真的有必要捕获'this'参数才能调用静态成员函数?我不明白为什么会这样,我甚至认可了这个电话B::.
问题:传递一个普通的lambda (到一个模板函数),它捕获this并调用一个this没有显式的成员函数,this->不能在gcc上编译.如果lambda不是通用的,或者lambda没有被传递给任何其他函数但是就地调用,那么它将编译为withoit this->.在所有情况下,Clang都很酷.
时间又一轮的铛VS GCC.谁是对的?
template<typename TF>
void call(TF&& f)
{
f(1);
}
struct Example
{
void foo(int){ }
void bar()
{
call([this](auto x){ foo(x); });
}
};
int main()
{
Example{}.bar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
bar()=call([this](auto x){ foo(x); });
错误:无法调用成员函数'void Example :: foo(int)'没有对象调用([this](auto x){foo(x);});`
bar()=call([this](auto x){ this->foo(x); });
我想在lambda表达式中调用我的类的方法:
void my_class::my_method(my_obj& obj)
{
}
void my_class::test_lambda()
{
std::list<my_obj> my_list;
std::for_each(my_list.begin(), my_list.end(), [](my_obj& obj)
{
// Here I want to call my_method:
// my_method(obj);
});
}
Run Code Online (Sandbox Code Playgroud)
我能怎么做?