я не могу составить следующую программу с GCC 6.1:GCC не может скомпилировать общий лямбда с этим захватом
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
class Foo
{
public:
void apply() const
{
std::for_each(std::cbegin(bars_), std::cend(bars_), [this] (const auto& x) { print(x); });
}
private:
std::vector<std::string> bars_;
void print(const std::string& x) const
{
std::cout << x << ' ';
}
};
int main()
{
Foo foo {};
foo.apply();
return 0;
}
сообщение об ошибке:
error: cannot call member function 'void Foo::print(const string&) const' without object
std::for_each(std::cbegin(bars_), std::cend(bars_), [this] (const auto& x) { print(x); });
^~~~~
Изменение
const auto& x
кconst std::string& x
делает компиляция программы.Изменение
print(x)
наthis->print(x)
делает компиляцию программы.Все версии с Clang (версия для Apple LLVM 7.3.0 (clang-703.0.31)).
Является ли это ошибкой компилятора?
Не могло ли это быть потому, что общая лямбда - это просто функция 'template', притворяющаяся не функцией' template', и вы должны также квалифицировать 'this->' в реальных функциях шаблона? IIRC ... –
@underscore_d Это для зависимых баз. –
clang компилирует его, возможно, его gcc-ошибку, см. Здесь: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61636 – marcinj