【发布时间】:2016-12-02 03:25:08
【问题描述】:
由于std::array<>和std::is_array<>都是在C++11中引入的,所以编译失败似乎很奇怪:
#include <array>
#include <type_traits>
static_assert(std::is_array<std::array<int,2>>::value);
有没有一种简单的方法来检查某个东西是否是一个数组,包括T[N] 和std::array<T,N> 的可能性?
【问题讨论】:
-
std::array根本不是一个数组。他们只是这么称呼它,因为它比std::array_wrapper或std::better_array更方便。 -
@user2357112:由于
is_array<>的含义是由定义array<>的同一语言的完全相同版本决定的,因此“数组不是数组”的概念似乎很荒谬,不是吗? -
智能指针也不通过
is_pointer。如果std::is_array是特殊情况下的std::array,那么std::is_array的用处就会降低,而使std::array成为一个实际的数组将首先破坏std::array的全部意义。只是不要让这些名称让您感到困惑。 -
鉴于引入了
std::array,一个更好的名称应该是std::is_carray。但是特质确实很混乱,并且按照自己的规则和古怪的名字发挥作用。比如根据std,std::complex<double>就不是arithmetic。 (std::is_arithmetic<std::complex<double>>是假的)。我认为这是因为获得正确的“概念”是困难的,即使是简单的。我预计在概念语言中会出现更多这样的问题,在这种语言中,事物的含义并不总是它们看起来的样子。
标签: c++ arrays c++11 typetraits