昨天,我惊讶地发现一些代码似乎将char[]
视为一种类型:
typedef std::unique_ptr<char[]> CharPtr;
以前,我可能会写出这样的内容:
typedef std::unique_ptr<char*, CharDeleter> CharPtr;
// Custom definition of CharDeleter omitted
经过一些研究,我发现char[]
语法是可行的,因为std::unique_ptr
提供了一个模板特化来处理数组(例如它会自动调用delete[]
来删除数组而不需要自定义删除器)
但是在C++中,char[]
实际上是什么意思呢?
我见过这样的语法:
const char a[] = "Constant string"; // Example 1
char *p = new char[5]; // Example 2
bool foo(char param[10]); // Example 3
以下是我对这些示例的解释:
示例1:在栈上分配了一个静态数组,因为编译时已知字符串的真实大小,所以空索引是有效的(例如,编译器在幕后基本上处理了长度)
示例2:动态分配了5个连续字符,第一个字符存储在p中存储的地址中。
示例3:定义了一个函数,该函数将大小为10的数组作为参数。(在幕后,编译器将数组视为指针)--例如,以下内容是错误的:
void foo(char test[5]) {}
void foo(char * test) {}
因为函数签名对编译器来说存在歧义。
我觉得我理解数组/指针的差异和相似之处。我的困惑可能源于我在构建/阅读C++模板方面缺乏经验。
我知道模板特化基本上允许根据模板类型参数使用定制的模板(基于特定模板)。char[]
只是可用于模板特化(调用特定特化)的语法吗?
另外,像char[]
这样的数组“类型”的正式名称是什么?
char[]
的话会更好。 - Lightness Races in Orbit