2015-12-23 9 views
1

Рассмотрим следующую программу (см видеодемонстрацию 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'; 

Что я понимаю неправильно здесь? Пожалуйста, помогите мне.

ответ

2

У вас не может быть массив абстрактного типа класса. Таким образом, вы получаете ошибку компилятора.

Но почему массив должен быть создан здесь? зачем нужна создать массив Если я не могу использовать этот массив? Разве это не потери памяти?

Массив не создан, вы передаете его тип в качестве аргумента шаблона. Компилятор видит, что это массив абстрактных объектов класса, и он жалуется.

+0

@ 101010: Тогда зачем следовать std :: cout << std :: is_array :: значение << '\ n'; не дает никакой ошибки компилятора? – Destructor

+1

@PravasiMeet 'std :: is_array :: value' здесь' T' не является массивом.Как отметил cpplearner, стандарт запрещает массивы абстрактных типов классов. – 101010

+0

@PravasiMeet, потому что 'T' является допустимым типом, хотя вы не можете создать его, тогда как' T [3] 'не является допустимым типом. –

5

N4567 § 8.3.4 Массивы [dcl.array] p1 (курсив мой)

В декларации T D, где D имеет вид

D1 [ constant-expressionopt] attribute-specifier-seqopt

и типом идентификатора в декларации T D1 является «имя-тип-деклараторT ", то тип идентификатора of D - тип массива; [...] T называется тип элемента массива; этот тип не должен быть ссылочным типом, void типа (возможно, cv-qualified), тип функции или тип абстрактного класса.

Таким образом, языковое правило просто запрещает вам создавать тип «массив типа класса abstrct».

 Смежные вопросы

  • Нет связанных вопросов^_^