Ich bemerkte, dass gcc 5.0 den folgenden Code ablehnt, während clang 3.6 es akzeptiert.Kann sizeofverted zweimal je ein abhängiger Ausdruck sein?
template<int n>
struct I
{
typedef int Type;
};
template<typename T>
struct A
{
typedef I<sizeof(sizeof(T))>::Type Type;
};
Die beiden Compilern scheinen zu unterscheiden, ob ein Ausdruck sizeof(sizeof(T))
typabhängig oder Wert-abhängig ist. Wenn der Ausdruck abhängig ist, dann folgt, dass I<sizeof(sizeof(T))>
ein abhängiger Typ ist, was bedeutet, dass typename
erforderlich sein sollte.
Dies wird durch die folgende Formulierung in der C++ 11-Standard behandelt:
[temp.dep.type]/8
A-Typ abhängig ist, ob es
ist
- Eine Simple-Template-ID, bei der entweder der Vorlagenname ein Vorlagenparameter oder ist. Alle Argumente der Vorlage sind ein abhängiger Typ oder ein Ausdruck, der typabhängig oder wertabhängig ist
[temp.dep.expr]/4
Ausdrücke der folgenden Formen sind nie typabhängig (weil die Art des Ausdrucks kann nicht abhängig sein):
sizeof unary-expression sizeof (type-id)
[temp.dep.constexpr]/2
Ausdrücke des folgenden Formulars sind wertabhängig, wenn der unäre Ausdruck oder Ausdruck typenabhängig ist oder die Typ-ID ist abhängig:
sizeof unary-expression sizeof (type-id)
Meine Interpretation ist, dass sizeof(T)
nie typabhängig sein kann, sizeof(sizeof(T))
Sinn kann nie typabhängig oder wertabhängig sein.
Ist das ein Fehler in gcc?
Oh. GCC denkt auch, dass "sizeof n" abhängig ist. http: // melon.org/wandbox/permlink/BLobLBzkQXNRfDuq – willj
Nun, 'sizeof n' ist nicht typabhängig, sondern wertabhängig. 'sizeof X', wobei' X' nicht * typabhängig ist, ist überhaupt nicht abhängig. Daher muss "sizeof sizeof n" nicht abhängig sein, nein? – dyp
Interessant kompiliert auf gcc 4.7.2, schlägt aber auf 4.9.0 fehl. – Barry