昨天,我惊讶地发现了一些似乎char[]被视为类型的代码:
typedef std::unique_ptr<char[]> CharPtr;
Run Code Online (Sandbox Code Playgroud)
以前,我会写一些类似的东西:
typedef std::unique_ptr<char*, CharDeleter> CharPtr;
// Custom definition of CharDeleter omitted
Run Code Online (Sandbox Code Playgroud)
经过一些研究,我发现char[]语法有效,因为std::unique_ptr提供了一个模板专门化来处理数组(例如,它会自动调用delete[]数组而不需要自定义删除器)
但是char[]在C++ 中究竟意味着什么呢?
我见过如下语法:
const char a[] = "Constant string"; // Example 1
char *p = new char[5]; // Example 2
bool foo(char param[10]); // Example 3
Run Code Online (Sandbox Code Playgroud)
这是我解释这些例子的方式:
示例1分配一个静态数组(在堆栈上)并且空索引是有效的,因为字符串的真实大小在编译时是已知的(例如,编译器基本上是在幕后处理我们的长度)
示例2动态分配5个连续字符,第一个字符存储在p中存储的地址中.
示例3定义了一个函数,该函数将大小为10的数组作为参数.(在后台,编译器将数组视为指针) - 例如,有一个错误:
void foo(char test[5]) {}
void foo(char * test) {}
Run Code Online (Sandbox Code Playgroud)
因为函数签名对编译器来说是不明确的.
我觉得我理解阵列/指针的差异和相似之处.我的困惑可能源于我缺乏构建/阅读C++模板的经验.
我知道模板专门化基本上允许根据模板类型参数使用自定义模板(基于特定模板).是char[]一个简单的语法,可用于模板特(调用特定的专门化)?
另外,数组"类型"的正确名称是char[]什么?
Microsoft 的I/O 完成端口文档指出:
请注意,虽然 [completion] 数据包按 FIFO 顺序排队,但它们可能会以不同的顺序出队。
我的理解是线程通过调用GetQueuedCompletionStatus从完成端口获取完成数据包。如果系统不能保证按 FIFO 顺序检索数据包,为什么系统会按 FIFO 顺序将数据包排队到完成端口?