путаница с оценкой класса шаблона 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 является абстрактным, поэтому невозможно создать объект структуры T.
Но рассмотрим следующее утверждение

std::cout<<std::is_array<T[3]>::value<<'\n';

Почему это дает мне ошибку? Оператор только проверяет, является ли данный тип массивом или нет. Означает ли это, что если T массив
& значение статического члена value оценивает true тогда массив объектов будет создан? Но почему массив должен быть создан здесь?
зачем создавать массив, если я не могу использовать этот массив? Разве это не просто потеря памяти?

Тогда почему следующее утверждение не дает никакой ошибки компилятора?

std::cout<<std::is_array<T>::value<<'\n';

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

1

Решение

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

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

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

2

Другие решения

N4567 § 8.3.4 Массивы [dcl.array] p1 (выделено мной)

В декларации T D где D имеет форму

D1 [ constant-expressionopt] attribute-specifier-seqopt

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

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

5

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector