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)
我在这里理解错了什么?请帮我.
N4567§8.3.4数组[dcl.array] p1(强调我的)
在具有表格的声明
T D中D
D1 [ constant-expressionopt] attribute-speci?er-seqopt并且声明中标识符的类型
T D1是" derived-declarator-type-listT",然后D 标识符的类型是数组类型; [...] T称为数组元素类型 ; 此类型不应是引用类型,(可能是cv-quali fi ed)类型void,函数类型或抽象类类型.
因此,语言规则只是禁止您创建类型"abstrct类类型".
| 归档时间: |
|
| 查看次数: |
140 次 |
| 最近记录: |