对 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-expression
opt
] attribute-specifier-seq
opt
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"。
考虑以下程序(查看现场演示 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
whereD
has the form
D1 [ constant-expression
opt
] attribute-specifier-seq
opt
and the type of the identifier in the declaration
T D1
is “derived-declarator-type-listT
”, 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"。