- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
昨天,我惊讶地发现一些代码似乎将 char[]
视为一种类型:
typedef std::unique_ptr<char[]> CharPtr;
以前,我会这样写:
typedef std::unique_ptr<char*, CharDeleter> CharPtr;
// Custom definition of CharDeleter omitted
经过一些研究,我发现 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
我是这样解释这些例子的:
示例 1 分配了一个静态数组(在堆栈上)并且空索引是有效的,因为字符串的真实大小在编译时是已知的(例如,编译器基本上在幕后为我们处理长度)
示例 2 动态分配 5 个连续字符,第一个字符存储在 p 中存储的地址。
示例 3 定义了一个将大小为 10 的数组作为参数的函数。 (在幕后,编译器将数组视为指针)——例如这是一个错误:
void foo(char test[5]) {}
void foo(char * test) {}
因为函数签名对编译器来说是不明确的。
我觉得我了解数组/指针的差异和相似之处。我的困惑可能源于我缺乏构建/阅读 C++ 模板的经验。
我知道模板特化基本上允许根据模板类型参数使用自定义模板(基于特定模板)。 char[]
只是一种可用于模板特化(调用特定特化)的语法吗?
此外,像 char[]
这样的数组“类型”的正确名称是什么?
最佳答案
What does
char[]
actually mean in C++?
让我们找出答案:
[C++11: 8.3.4/1]:
In a declarationT D
whereD
has the form
D1 [
constant-expressionopt]
attribute-specifier-seqoptand the type of the identifier in the declaration
T D1
is “derived-declarator-type-listT
”, then the type of the identifier ofD
is an array type; if the type of the identifier ofD
contains theauto
type-specifier, the program is ill-formed.T
is called the array element type; this type shall not be a reference type, the (possibly cv-qualified) typevoid
, a function type or an abstract class type. If the constant-expression (5.19) is present, it shall be an integral constant expression and its value shall be greater than zero. The constant expression specifies the bound of (number of elements in) the array. If the value of the constant expression isN
, the array hasN
elements numbered0
toN-1
, and the type of the identifier ofD
is “derived-declarator-type-list array ofN T
”. An object of array type contains a contiguously allocated non-empty set ofN
subobjects of typeT
. Except as noted below, if the constant expression is omitted, the type of the identifier ofD
is “derived-declarator-type-list array of unknown bound ofT
”, an incomplete object type. The type “derived-declarator-type-list array ofN T
” is a different type from the type “derived-declarator-type-list array of unknown bound ofT
”, see 3.9. [..]
正如您所指出的,这些“未知边界数组”正在通过 std::unique_ptr
特化使用。
关于示例 1,虽然在 [C++11: 8.5.5]
中出人意料地不清楚,但带有初始化程序的 char[]
是一种特殊情况,未涵盖通过上面的文字:a
实际上是一个const char[16]
。所以,是的,“编译器基本上在幕后为我们处理长度”。
Example 3 defines a function that takes an array of size 10 as a parameter. (Behind the scenes the compiler treats the array like a pointer)
差不多。事实上,没有任何关于它的“幕后”:转换在手册中。它是首要的、明确的和标准化的。
所以:
-- e.g. it is an error to have:
void foo(char test[5]) {}
void foo(char * test) {}because the function signatures are ambiguous to the compiler.
事实上,这不是由于“歧义”造成的错误,而是因为您确实定义了同一个函数两次。
关于c++ - "char[]"是正确的类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29172362/
这个问题在这里已经有了答案: Why don't Java's +=, -=, *=, /= compound assignment operators require casting? (11 个
当我尝试运行以下代码时,List(.of) 无法编译并给出主题错误。 package collections; import java.util.LinkedHashSet; import java.
我正在尝试编译使用 ChatScript 库的程序。这是我在名为 main.cpp 的文件中的代码: #include #include "common.h" using namespace std
我想在我的程序中外部使用 ChatScript。在documents它说: Embedding Step #1 First, you will need to modify `common.h and
假设我有一个 char,我想用一行代码将其 strcat() 转换为 char 数组。对于 [一个非实用的] 示例: strcat("ljsdflusdfg",getchar()); 或者我想做相反的
我有以下类型签名: *Main Lib> let f :: a -> a -> a -> a; f = undefined *Main Lib> let x :: Char; x = undefin
我正在学习如何在 C 中使用指针(使用 malloc 和 free),但我在这个练习中遇到了一些麻烦。我只想制作一个指针数组,我想在其中保存每个单词的方向。然后我想为一个特定的词做一个 free(),
我有一个字符*: char* version = "10.5.108"; 我想通过字符分隔符获取两个新的 char*。 char delimiter = '.'; 执行以下代码后: printf("|
最近在学习Cpp,今天在学习使用Clion做测试的时候,发生了奇怪的事情。 这是我的代码 int main() { char c = 'b'; char carr[1]{'a'};
我对 c 很陌生,我正在审查一些代码。我遇到了这个: static char * fromDataType; static char * toDataType; static char * fromR
我有一个像这样的动态结构: struct network { int count; char** ips; } 如果我知道每个字符串数组都是 16 个字节(即 INET_ADDRSTR
我有一个旧程序,其中使用了一些库函数,但我没有那个库。 所以我正在使用 C++ 库编写该程序。在那个旧代码中有一些函数是这样调用的 *string = newstrdup("这里有一些字符串"); 字
我正在编写一个函数,该函数接受 ArrayList,然后将每个 char[] 复制到另一个增加长度的 char[] 中,然后将新的 char[] 添加到新的 ArrayList 中。当我尝试复制数组时
我正在寻找 map >并生成每个可能的 map从它。 我知道这可能会占用大量内存并需要一些时间。 每个map需要包含每个字母 a-z,并映射到唯一的 a-z 字符。 IE。啊bjcp迪EVfh嘎血红蛋
#define NAME_LEN 20 #include "stdio.h" #include "stdlib.h" #include "string.h" #pragma warning(disab
所以我必须创建一个函数来找到一对带有第一个字母并返回第二个字母的函数。 我实际上找到了一个答案,但是使用 map 功能却找不到。 lookUp :: Char -> [(Char, Cha
我最近接受采访并要求写mystrcat(*s1, *s2, *s3) 其中s1 和s2 是源字符串连接结果由 s3 给出。有人告诉我,不要担心 s3 的内存分配,并假设 s1 和 s2 不是空/无效字
今天我与一位同事讨论了他(对我来说)不寻常的“main”函数签名。他喜欢这样声明: int main(int argc, char* (*argv)[]) { printf("at index
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: What's the difference between new char[10] and new cha
通常字符串文字是 const char[] 类型。但是当我把它当作其他类型时,我得到了奇怪的结果。 unsigned char *a = "\355\1\23"; 使用此编译器会抛出警告“初始化中的指
我是一名优秀的程序员,十分优秀!