【问题标题】:confusion about evaluation of is_array template class关于 is_array 模板类评估的混淆
【发布时间】:2015-12-23 13:46:23
【问题描述】:

考虑以下程序(查看现场演示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?
}

我知道创建抽象类的对象是不可能的。这里的 T 是抽象的,所以不可能创建 struct T 的对象。 但请考虑以下陈述

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

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

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

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

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

【问题讨论】:

    标签: c++ object abstract-class evaluation class-template


    【解决方案1】:

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

    T D 的声明中,D 的格式为

    D1 [ constant-expressionopt] attribute-specifier-seqopt

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • @101010: 那为什么要跟随 std::cout::value
      • @PravasiMeet std::is_array&lt;T&gt;::value 这里 T 不是数组。正如 cpplearner 提到的,标准禁止抽象类类型的数组。
      • @PravasiMeet 因为T 是有效类型,但您无法创建,而T[3] 不是有效类型。
      猜你喜欢
      • 2021-08-27
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      相关资源
      最近更新 更多