关于评估is_array模板类的困惑

Des*_*tor 1 c++ evaluation abstract-class object class-template

考虑以下程序(请参阅此处的实时演示.)

#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?
}
Run Code Online (Sandbox Code Playgroud)

我知道创建抽象类的对象是不可能的.这里T是抽象的,因此不可能创建struct T的对象.但请考虑以下语句

std::cout<<std::is_array<T[3]>::value<<'\n';
Run Code Online (Sandbox Code Playgroud)

为什么它会给我一个错误?该语句仅检查给定类型是否为数组.是否意味着如果T是静态成员的阵列&值value的计算结果为true然后对象数组将被创建?但是,为什么需要在这里创建数组呢?什么是创建数组的需要如果我不能使用该数组?这不仅仅是记忆的浪费吗?

那么为什么以下语句不会给出任何编译器错误?

std::cout<<std::is_array<T>::value<<'\n';
Run Code Online (Sandbox Code Playgroud)

我在这里理解错了什么?请帮我.

cpp*_*ner 5

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

在具有表格的声明T DD

D1 [ constant-expressionopt] attribute-speci?er-seqopt

并且声明中标识符的类型T D1是" derived-declarator-type-list T ",然后D 标识符的类型是数组类型; [...] T称为数组元素类型 ; 此类型不应是引用类型,(可能是cv-quali fi ed)类型void,函数类型或抽象类类型.

因此,语言规则只是禁止您创建类型"abstrct类类型".