W brzękiem/llvm 3.6.2 następujące wyniki w kod błędu kompilacji podczas kompilacji z std=c++11
: liniaCzy jest to niedozwolone pobranie nieregularnego elementu struct struct 'sizeof` w szablonie klasy?
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();
}
poleceń inwokacja:
$ 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();
Gdybym nie zmieni bar
być szablon, jak w
class bar
{
public:
struct foo
{
int array[10];
};
int baz()
{
return sizeof(foo::array);
}
};
int main(void)
{
bar b;
return b.baz();
}
wtedy kod kompiluje się czysto. Uwaga: GCC 5.2.1 akceptuje obie wersje pod numerem std=c++11
. Warto również zauważyć, że przeniesienie array
do szablonu szablonu klasy otaczającej (ale pozostawiając go jako szablonu) powoduje również, że klang to akceptuje.
Jakie zachowanie jest prawidłowe w stosunku do normy? Czy jest to błąd w GCC, klangu lub obu?
(Pytałem tego samego question o użytkowników cfe, ale jak dotąd nie otrzymałem żadnej odpowiedzi).
Wygląda jak błąd w klangu ++. Czekający guru, aby to potwierdzić. – YSC
Tak, na pewno błąd. – SergeyA
Rozwiązania problemu 'sizeof (((foo *) 0) -> array)' wymienione w http://stackoverflow.com/questions/29359661/clang-error-invalid-use-of-non-static-data-member dotyczy tu też. –