模板专业化中 T[N] 和 T[] 之间的差异

Difference between T[N] and T[] in template specializations?

本文关键字:之间 专业化      更新时间:2023-10-16

查看std::is_array的示例实现,它们具有以下代码:

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 {};

什么时候会匹配T[]专业化,而不是T[N]专业化?为什么需要两个?我认为这个T[]与函数参数中的函数参数不同,在函数参数中,它与指针的含义相同,对吗?

类型 T[] 是一个不完整的类型,已知它是一个数组,但大小(也是类型的一部分(此时未知。它可以在某些上下文中使用,在这些上下文中,您可能需要检查声明为这样的变量是否是数组。虽然变量的类型仍然不完整,但std::array的第二个特化将不匹配,因为大小未知。

// test.h
struct Test {
   static int data[];
};
// test.cpp
int Test::data[10];

仅包含标头但没有可见性test.cpp的 TU 可能需要测试Test::data是否为数组。