gpt4 book ai didi

c++ - 从字符串文字初始化字符数组是数组复制初始化的情况吗?

转载 作者:行者123 更新时间:2023-11-30 05:40:36 29 4
gpt4 key购买 nike

在我看来,我一直认为用该文字的类型和值的临时变量替换对文字的任何使用都很好。如果这种情况,因为字符串文字是 const char 数组类型,所以通过字符串文字初始化字符数组不会被视为数组复制初始化?例如。不会

const char test1[] = "hello";

有点像做...

const char temp[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
const char test2[] = temp;

因为这是一个数组复制初始化的例子,所以哪个会被禁止?如果文字的类型 数组,字符串文字如何用于初始化数组?也许有点相关,如果字符串文字是 const char 数组类型,那么下面的代码在我的系统上似乎编译得很好吗?

char* test3 = "hello";

由于 test3 缺少低级 const,编译器错过了这种非法转换,但它仍然可以正常编译?当然,尝试通过 test3 更改任何元素都会导致程序崩溃。

最佳答案

数组的复制和直接初始化没有区别。这两种情况都由编译器以相同方式处理。你一开始做的类比更像是一个经验法则。实际上,一个数组不能被另一个数组初始化,除非它是一个字符串文字。顺便说一句,你的类比并不完全正确。目标数组将使用临时数组直接初始化:

const char test2[](test1);

但出于同样的原因,这仍然无法编译。这就是字符数组的初始化工作原理。

[dcl.init]/p17:

The semantics of initializers are as follows. The destination type is the type of the object or reference being initialized and the source type is the type of the initializer expression. If the initializer is not a single (possibly parenthesized) expression, the source type is not defined.

  • If the initializer is a (non-parenthesized) braced-init-list, the object or reference is list-initialized (8.5.4).
  • If the destination type is a reference type, see 8.5.3.
  • If the destination type is an array of characters, an array of char16_t, an array of char32_t, or an array of wchar_t, and the initializer is a string literal, see 8.5.2.

8.5.2:

An array of narrow character type (3.9.1), char16_t array, char32_t array, or wchar_t array can be initialized by a narrow string literal, char16_t string literal, char32_t string literal, or wide string literal, respectively, or by an appropriately-typed string literal enclosed in braces (2.13.5). Successive characters of the value of the string literal initialize the elements of the array. [ Example:

char msg[] = "Syntax error on line %s\n";

shows a character array whose members are initialized with a string-literal. [..]

在您的另一个示例中,字符串文字衰减为指向其第一个元素的指针,test3 被初始化。此代码在 C++111 中无效,因为衰减的指针是 const char*,但这在 C 中是有效的转换,因为字符串文字是非常量。它在 C++03 之前被允许使用,但在 C++03 中被弃用。


1:一些编译器仍然允许 C++11 中的转换作为扩展。

关于c++ - 从字符串文字初始化字符数组是数组复制初始化的情况吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31550990/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com