Рассмотрим следующую программу (см видеодемонстрацию here.)путаница оценки is_array шаблонного класса
#include <iostream>
#include <type_traits>
int main()
{
struct T{ virtual void foo()=0;};
std::cout<<std::boolalpha;
std::cout<<std::is_array<int[3]>::value<<'\n';
std::cout<<std::is_array<T>::value<<'\n';
std::cout<<std::is_array<T1[2]>::value<<'\n';
std::cout<<std::is_array<T[3]>::value<<'\n'; // why uncommenting this line causes compile time error?
}
Я знаю, что это невозможно создать объект абстрактного класса. Здесь T является абстрактным, поэтому невозможно создать объект структуры Т. Но рассмотрим следующее заявление
std::cout<<std::is_array<T[3]>::value<<'\n';
Почему это дает мне ошибку? Оператор проверяет, является ли данный тип массивом или нет. Означает ли это, что если T является массивом & значение статического члена value
оценивается в true
, тогда будет создан массив объектов? Но зачем нужен массив для создания здесь? Что такое необходимость создания массива Если я не могу использовать этот массив? Разве это не просто потеря памяти?
Тогда почему следующий оператор не дает никакой ошибки компилятора?
std::cout<<std::is_array<T>::value<<'\n';
Что я понимаю неправильно здесь? Пожалуйста, помогите мне.
@ 101010: Тогда зачем следовать std :: cout << std :: is_array :: значение << '\ n'; не дает никакой ошибки компилятора? –
Destructor
@PravasiMeet 'std :: is_array :: value' здесь' T' не является массивом.Как отметил cpplearner, стандарт запрещает массивы абстрактных типов классов. –
101010
@PravasiMeet, потому что 'T' является допустимым типом, хотя вы не можете создать его, тогда как' T [3] 'не является допустимым типом. –