1

考虑以下程序(在此处查看现场演示

#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 是抽象的,所以不可能创建 struct T 的对象。但是考虑以下语句

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

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

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

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

我在这里理解错了吗?请帮我。

4

2 回答 2

5

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

在有表格的声明T DD

D1 [ constant-expressionopt] attribute-specifier-seqopt

且声明中标识符的类型T D1为“<em>derived-declarator-type-list T”,则D的标识符类型为数组类型;[...] T 称为数组元素类型;此类型不应是引用类型、(可能是 cv 限定的)类型 void、函数类型或抽象类类型

因此,语言规则只是禁止您创建“抽象类类型数组”类型。

于 2015-12-23T14:00:01.277 回答
2

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

但是,为什么这里需要创建数组呢?如果我无法使用该数组,需要创建一个数组吗?这不就是浪费内存吗?

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

于 2015-12-23T13:51:06.223 回答