I 6.1 das folgende Programm mit gcc nicht kompilieren können:gcc nicht generic Lambda mit dieser Aufnahme kompilieren
#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;
}
Die Fehlermeldung lautet:
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); });
^~~~~
Ändern
const auto& x
-const std::string& x
das macht Programm kompilieren.Durch die Änderung
print(x)
zuthis->print(x)
wird das Programm kompiliert.Alle Versionen kompilieren mit Clang (Apple LLVM Version 7.3.0 (clang-703.0.31)).
Ist das ein Compilerfehler?
Könnte das nicht sein, weil ein generisches Lambda nur eine 'Template'-Funktion ist, die vorgibt, keine' Template'-Funktion zu sein, und Sie müssen 'this->' ähnlich in echten Template-Funktionen qualifizieren? IIRC ... –
@underscore_d Das ist für abhängige Basen. –
clang kompiliert es, vielleicht ist es gcc Bug, siehe hier: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61636 – marcinj