std::is_array
определен как true только для типов, которые выглядят как T[]
или T[N]
. std::array
не входит.
std::is_array
true_type
std::array
не соответствует указанным нормам; что сделает вашу программу плохо сформированной, никакой диагностики не требуется. При специализированных типах в пределах std
результат должен соответствовать стандарту, и здесь определен конкретный стандарт. (Кроме того, делать это для других шаблонов в пределах std
очень сомнительно для незаконных).
Вы можете создать свой собственный is_array
черта:
namespace notstd {
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{};
// optional:
template<class T>
struct is_array<T const>:is_array<T>{};
template<class T>
struct is_array<T volatile>:is_array<T>{};
template<class T>
struct is_array<T volatile const>:is_array<T>{};
}
notstd::is_array<T>
затем использовать в других местах, чтобы обнаружить либо массивы в стиле С или C++ std::array
.
'std :: array' просто не является массивом. Они просто назвали это потому, что это более удобное имя, чем нечто вроде 'std :: array_wrapper' или' std :: better_array'. – user2357112
@ user2357112: Поскольку значение 'is_array <>' было определено точно такой же версией того же языка, который определил 'array <>', понятие «массив не является массивом» кажется абсурдным, не так ли? ? –
Умные указатели не передают 'is_pointer'. 'std :: is_array' был бы менее полезен, если бы он был« std :: array »с особыми номерами и создавал' std :: array' фактический массив, чтобы победить весь смысл создания 'std :: array' в первую очередь , Просто не позволяйте им путать вас. – user2357112