模板特化中T [N]和T []之间的差异?

uk4*_*321 9 c++ templates template-specialization

纵观示例实现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 {};
Run Code Online (Sandbox Code Playgroud)

当将T[]专业化相匹配,而不是T[N]专业化?为什么需要两个?我假设这T[]与函数参数中的不一样,它表示与指针相同的东西吗?

Dav*_*eas 9

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

// test.h
struct Test {
   static int data[];
};
// test.cpp
int Test::data[10];
Run Code Online (Sandbox Code Playgroud)

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