2015-03-18 18 views
10

GCC, Clang, ICC e MSVC rifiutano tutti questo codice, ma non trovo alcuna regola violata nell'ultima bozza di lavoro dello standard C++.Un membro non statico di un modello è specializzato in dati o funzioni?

La regola è già presente nello standard o si trova in un rapporto sui difetti?

#include <type_traits> 

template< typename t > 
struct s { 
    std::conditional_t< std::is_integral<t>::value, t, void() > mem; 
}; 

s<int> a; 
s< void * > b; 
+0

Cosa ti aspetti che 'void()' valuti? – StenSoft

+0

@StenSoft 'void()' è solo il tipo di 'mem'. Non è possibile valutare 's :: mem', perché è il nome di una funzione non implementata. Ma questo è al di fuori della portata della domanda. – Potatoswatter

+0

void() tipo di funzione, in genere utilizzato per la deduzione del tipo di modello, non definire o dichiarare una var. –

risposta

8

Il codice è valido a causa 14.3.1/3:

Se una dichiarazione acquisisce un tipo di funzione attraverso un tipo dipendente da un modello di parametri e questo provoca una dichiarazione che non lo fa usa la forma sintattica di un dichiaratore di funzioni per avere il tipo di funzione, il programma è mal formato.

Il tipo di dichiarazione qui dipende dal parametro modello t e, pertanto, non può essere un tipo di funzione.

+0

Ah, grazie! Non l'avrei mai cercato lì. Questa regola sta discutendo sulla dipendenza dal tipo e si applica anche allo scope locale. IMHO sarebbe meglio posizionato in [temp.dep.type] §14.6.2.1. – Potatoswatter

+0

... e, a proposito, MSVC e ICC (v13.0.1) non riescono a diagnosticarlo a livello locale. – Potatoswatter

Problemi correlati