In Klirren/llvm 3.6.2 Der folgende Code führt zu einem Kompilierungsfehler, wenn sie mit std=c++11
Kompilieren:Ist es illegal, dass 'sizeof` nicht-statisches Mitglied von struct in der Klassenvorlage verschachtelt wird?
template <typename T=void>
class bar
{
public:
struct foo
{
int array[10];
};
int baz()
{
return sizeof(foo::array);
}
};
int main(void)
{
bar<> b;
return b.baz();
}
Kommandozeilenaufruf:
$ clang++ -std=c++11 nonstatic.cpp -o nonstatic
nonstatic.cpp:12:28: error: invalid use of non-static data member 'array'
return sizeof(foo::array);
~~~~~^~~~~
nonstatic.cpp:20:14: note: in instantiation of member function
'bar<void>::baz' requested here
return b.baz();
Wenn ich bar
ändern ein nicht mehr zu sein, Vorlage, wie in
class bar
{
public:
struct foo
{
int array[10];
};
int baz()
{
return sizeof(foo::array);
}
};
int main(void)
{
bar b;
return b.baz();
}
dann kompiliert der Code sauber. Beachten Sie, dass GCC 5.2.1 beide Versionen unter std=c++11
akzeptiert. Beachten Sie auch, dass das Verschieben von in den umschließenden Klassenschablonenkörper (aber als Vorlage) auch dazu führt, dass dies akzeptiert wird.
Welches Verhalten ist korrekt gegenüber dem Standard? Ist das ein Fehler in GCC, Clam oder beides?
(Ich fragte die gleiche question auf cfe-Benutzer, aber bisher keine Antwort erhalten haben).
Sieht aus wie ein clang ++ Bug. Wartende Gurus bestätigen dies. – YSC
Ja, sicherlich ein Fehler. – SergeyA
Die Problemumgehung 'sizeof (((foo *) 0) -> array)', die in http://stackoverflow.com/questions/29359661/clang-error-invalid-use-of-non-static-data-member erwähnt wird, gilt auch hier. –