为什么std :: is_array对std :: array返回false?

时间:2016-12-02 03:25:08

标签: c++ arrays c++11 typetraits

由于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>的可能性?

2 个答案:

答案 0 :(得分:4)

ISO / IEC 14882:2011,§20.9.4.1,表47说明了这一点:

  • 模板:模板结构is_array;

  • 条件:T是已知或未知范围的数组类型(3.9.2)

  • 注释:类模板数组(23.3.2)不是数组类型。

所以,断言应该失败。

虽然您可以按照@ 0x499602D2的建议专门化is_array,但如果您这样做,则应该在另一个命名空间中这样做,因为您不应该尝试更改标准化函数的含义。

答案 1 :(得分:1)

Cppreference提供了这种可能的实现:

template<class T>
struct is_array : std::false_type {};

template<class T>
struct is_array<T[]> : std::true_type {};

template<class T, std::size_t N>
struct is_array<T[N]> : std::true_type {};

不幸的是,它没有为std::array提供专业化。你可以这样做:

template<class T>
struct is_array : std::is_array<T> {};
template<class T, std::size_t N>
struct is_array<std::array<T, N>> : std::true_type {};