Проблема: передача общей лямбды (в функцию шаблона), которая захватывает 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?
Кто не соответствует стандарту?