Проблема: передача общей лямбды (в функцию шаблона), которая захватывает this
и вызывает функцию-член this
без явного this->
не компилируется на gcc. Если лямбда не является общей, или если лямбда не передана какой-либо другой функции, а вызвана на место, она компилируется с явным this->
. Clang - это классный код во всех ситуациях.
Время для другого раунда 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;
}
- С
bar()
=call([this](auto x){ foo(x); });
- clang++ 3.6+ компилирует.
- g++ 5.2+ не компилируется.
error: невозможно вызвать функцию-член 'void Пример:: foo (int)' без объекта call ([this] (auto x) {foo (x);}); `
- С
bar()
=call([this](auto x){ this->foo(x); });
- clang++ 3.6+ компилирует.
- g++ 5.2+ компилируется.
- С
bar()
=call([this](int x){ foo(x); });
- clang++ 3.6+ компилирует.
- g++ 5.2+ компилируется.
- С
bar()
=[this](auto x){ foo(x); }(1);
- clang++ 3.6+ компилирует.
- g++ 5.2+ компилируется.
Почему this->
необходимо только в случае общей лямбда?
Почему this->
не требуется, если лямбда не передается в call
?
Кто не соответствует стандарту?