2015-06-13 21 views
6

Si consideri il seguente codice, che simula un lambda constexpr (proposto per C++ 17, non disponibile in C++ 14).Ricerca dei nomi per i membri della classe locale all'interno dei modelli

#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; 
} 

Qui, il lambda definita all'interno di un membro di modello di funzione di un modello di classe. Sorprendentemente, devo this-> ambiguo le variabili membro lambdan_ e x_.

esempi live (with this->, without this->)

Ho avuto l'impressione che questo è necessario solo in classi di base dipendenti, ma la classe lambda è solo una classe locale, non una classe base dipendente.

Domanda: qualcuno può indicarmi gli standard pertinenti per la ricerca dei nomi dei membri della classe locale all'interno dei modelli?

+2

Il codice senza 'questo' è accettato da clang ++ 3.7 (ToT). Vedi per es. http://melpon.org/wandbox/ – dyp

risposta

2

Grazie al commento di @ dyp, sembra essere un bug in Clang 3.5/3.6 che punta di tronco is fixed in Clang 3.7. G ++ 4.8.1 attraverso la punta del tronco compilare anche questo correttamente.

Problemi correlati