2015-06-13 16 views
6

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?

+2

Der Code ohne 'This' wird von clang ++ 3.7 (ToT) akzeptiert. Siehe z.B. http://melpon.org/wandbox/ – dyp

Antwort

2

Dank dem Kommentar von @dyp, es scheint ein Bug in Clang 3.5/3.6, dass is fixed in Clang 3.7 Spitze des Stammes. G ++ 4.8.1 bis Tip of Trunk kompilieren das auch korrekt.