Gcc не может скомпилировать общую лямбду с этим захватом

Я не могу скомпилировать следующую программу с 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)).

Является ли это ошибкой компилятора?

Ответ 1

Это документированная ошибка gcc, которая по состоянию на август 2016 года еще не исправлена.

Ответ 2

Я не думаю, что компилятор обязан вывести тип, передаваемый лямбда внутри функции for_each, помните, что эта функция уже скомпилирована, как компилятор может узнать, что функция for_each собирается передать лямбда после того, как она прошла лямбда в?

Ответ 3

Я не знаю почему. Но решение должно указать, какую печать он должен использовать: std::for_each(std::cbegin(bars_), std::cend(bars_), [this] (const auto& x) { this->print(x); });

С этим он компилируется. См.: http://coliru.stacked-crooked.com/a/1177b09a3e5863e2