問題:通過一個通用的λ(一個模板函數)捕獲this
並調用this
一個成員函數沒有明確this->
沒有就GCC。如果lambda不是泛型的,或者lambda沒有傳遞給任何其他函數,但是已經調用,它就會編譯一個明確的this->
。在所有情況下,Clang都很酷。調用`從通用拉姆達this`成員函數 - 鐺VS GCC
時間爲另一輪鐺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;
}
- 隨着
bar()
=call([this](auto x){ foo(x); });
- 鐺++ 3.6+ 編譯。
- g ++ 5.2+ 不能編譯。
error: cannot call member function 'void Example::foo(int)' without object call([this](auto x){ foo(x); });`
- 隨着
bar()
=call([this](auto x){ this->foo(x); });
- 鐺++ 3.6+ 編譯。
- g ++ 5.2+ 編譯。
- 隨着
bar()
=call([this](int x){ foo(x); });
- 鐺++ 3.6+ 編譯。
- g ++ 5.2+ 編譯。
- 隨着
bar()
=[this](auto x){ foo(x); }(1);
- 鐺++ 3.6+ 編譯。
- g ++ 5.2+ 編譯。
爲什麼只在一個通用的拉姆達的情況下,必要的this->
?
爲什麼this->
沒有必要,如果lambda沒有傳遞給call
?
誰不符合標準?
您注意到的不一致表明clang在這裏是正確的。 –
甚至沒有看標準,我可以絕對肯定地說Cla是正確的。即使它不同意這個標準,它仍然是正確的。在這種情況下,標準是錯誤的。 GCC的行爲毫無意義。 –
[相關但不是愚蠢?](http://stackoverflow.com/q/20312062/819272) – TemplateRex