2015-03-18 4 views
10

GCC, Clang, ICC und MSVC lehnen alle diesen Code ab, aber ich finde keine verletzte Regel im letzten Arbeitsentwurf des C++ - Standards.Kann sich ein nicht statisches Mitglied einer Vorlage auf Daten oder Funktionen spezialisieren?

Liegt die Regel bereits im Standard oder ist es in einem Fehlerbericht?

#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

Was erwarten Sie von 'void()'? – StenSoft

+0

@StenSoft 'void()' ist nur der Typ von 'mem'. Sie können ' :: mem' nicht auswerten, weil es der Name einer nicht implementierten Funktion ist. Aber das ist außerhalb des Bereichs der Frage. – Potatoswatter

+0

void() - Funktionstyp, der normalerweise für den Vorlagentyp-Abzug verwendet wird, nicht definieren oder deklarieren var(). –

Antwort

8

Der Code ist ungültig aufgrund 14.3.1/3:

Wenn eine Erklärung auf einem Template-Parameter einen Funktionstyp durch eine typabhängig erfasst und dies verursacht eine Erklärung, die nicht der Fall ist Verwenden Sie die syntaktische Form eines Funktionsdeklarators, um den Funktionstyp zu haben, das Programm ist fehlerhaft.

Der Typ der Deklaration hängt hier vom Template-Parameter t ab und kann daher kein Funktionstyp sein.

+0

Ah, danke! Hätte nie danach gesucht. Diese Regel diskutiert die Typabhängigkeit, und sie gilt auch auf lokaler Ebene. IMHO wäre es besser in [temp.dep.type] §14.6.2.1 platziert. – Potatoswatter

+0

... und MSVC und ICC (v13.0.1) versäumen es übrigens, es lokal zu diagnostizieren. – Potatoswatter

Verwandte Themen