Betrachten Sie den folgenden Code, der eine constexpr
Lambda simuliert (vorgeschlagen für C++ 17, nicht verfügbar in C++ 14).Name suchen für lokale Klassenmitglieder in Vorlagen
#include <iostream>
template<int M, class Pred>
constexpr auto fun(Pred pred)
{
return pred(1) <= M;
}
template<int M>
struct C
{
template<int N>
static constexpr auto pred(int x) noexcept
{
// simulate a constexpr lambda (not allowed in C++14)
struct lambda
{
int n_, x_;
constexpr auto operator()(int y) const noexcept
{
return this->n_ * this->x_ + y;
// ^^^^ ^^^^ <---- here
}
};
return fun<M>(lambda{N, x});
}
};
int main()
{
constexpr auto res = C<7>::template pred<2>(3);
std::cout << res; // prints 1, since 2 * 3 + 1 <= 7;
}
Hier wird die lambda
ist in einem Funktionsschablone Mitglied einer Klasse Vorlage definiert. Überraschenderweise muss ich this->
die lambda
Mitgliedsvariablen n_
und x_
ambiguieren.
Live-Beispiele (with this->
, without this->
)
Ich hatte den Eindruck, dass dies in den abhängigen Basisklassen nur notwendig ist, aber die lambda
Klasse ist nur eine lokale Klasse, kein abhängiges Basisklasse.
Frage: kann mir jemand auf die relevanten Standardese für die Namenssuche von lokalen Klassenmitgliedern in Templates zeigen?
Der Code ohne 'This' wird von clang ++ 3.7 (ToT) akzeptiert. Siehe z.B. http://melpon.org/wandbox/ – dyp