Ответ 1
Это документированная ошибка gcc, которая по состоянию на август 2016 года еще не исправлена.
Я не могу скомпилировать следующую программу с gcc 6.1:
#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)).
Является ли это ошибкой компилятора?
Это документированная ошибка gcc, которая по состоянию на август 2016 года еще не исправлена.
Я не думаю, что компилятор обязан вывести тип, передаваемый лямбда внутри функции for_each, помните, что эта функция уже скомпилирована, как компилятор может узнать, что функция for_each собирается передать лямбда после того, как она прошла лямбда в?
Я не знаю почему. Но решение должно указать, какую печать он должен использовать:
std::for_each(std::cbegin(bars_), std::cend(bars_), [this] (const auto& x) { this->print(x); });
С этим он компилируется. См.: http://coliru.stacked-crooked.com/a/1177b09a3e5863e2