对 is_array 模板 class 评估的困惑

confusion about evaluation of is_array template class

考虑以下程序(查看现场演示 here.

#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?
}

我知道无法创建抽象对象 class。这里 T 是抽象的,所以不可能创建结构 T 的对象。 但是请考虑以下语句

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

为什么它给我一个错误?该语句仅检查给定类型是否为数组。这是否意味着 If T is array & 静态成员 value 的值计算为 true 那么将创建对象数组? 但是,这里为什么要创建数组呢? 如果我无法使用该数组,需要创建一个数组吗?这不是浪费内存吗?

那为什么下面的语句没有给出任何编译错误?

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

我哪里理解错了?请帮助我。

您不能拥有抽象 class 类型的数组。因此,您会收到编译器错误。

But, why array is required to be created here? what is the need to create an array If I am not able to use that array? Isn't this just wastage of memory?

数组未创建,您将其类型作为模板参数传递。编译器看到这是一个抽象 class 对象的数组,它会抱怨。

N4567 § 8.3.4 数组 [dcl.array]p1(强调我的)

In a declaration T D where D has the form

D1 [ constant-expressionopt] attribute-specifier-seqopt

and the type of the identifier in the declaration T D1 is “derived-declarator-type-list T”, then the type of the identifier of D is an array type; [...] T is called the array element type; this type shall not be a reference type, the (possibly cv-qualified) type void, a function type or an abstract class type.

因此,语言规则只是禁止您创建类型 "array of abstrct class type"。