char a[] = "" 中使用的初始化名称是什么

问题描述 投票:0回答:2

初始化是什么类型:

char a[] = ""; // ???                 (copies array content)
char* q = a;   // copy-initialization (copies pointer)
// EDIT: originally it was `char q[] = a;` which doesn't compile

在 C 中,这称为“数组初始化”。

在 C++ 中,它看起来像复制初始化,但我不确定。熟悉标准的人可以给我指出它命名的确切段落吗?

c++ arrays initialization language-lawyer string-literals
2个回答
2
投票

C++23 标准对此是这么说的:

9.4.3 字符数组 [dcl.init.string]
  1. 普通字符类型数组 (6.8.2)、

    char8_t
    数组、
    char16_t
    数组、
    char32_t
    数组或
    wchar_t
    数组可以通过普通字符串文字、UTF-8 字符串文字、UTF 来初始化-16 字符串文字,UTF-32 字符串 分别是文字或宽字符串文字,或用大括号括起来的适当类型的字符串文字(5.13.5)。 此外,
    char
    unsigned char
    数组可以通过 UTF-8 字符串文字或用大括号括起来的字符串文字来初始化。字符串文字值的连续字符初始化元素 的数组,如有必要,可对源值和目标值进行积分转换 (7.3.9)。

    [示例 1 :

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

    显示一个字符数组,其成员用字符串文字初始化。请注意,由于

    \n
    是单个字符,并且附加了尾随
    \0
    ,因此
    sizeof(msg)
    为 25。 — 结束示例]

  2. 初始化器的数量不得多于数组元素的数量。

    [示例 2 :

    char cv[4] = "asdf"; // error
    

    格式错误,因为没有空间容纳隐含的尾随

    \0
    。 — 结束示例]

  3. 如果初始化器的数量少于数组元素的数量,则每个未显式初始化的元素应为零初始化(9.4)。

该标准没有更具体地提及字符串文字的初始化:“字符串文字可以初始化...的数组”和相应的CharT,这意味着它会退回到简单的聚合初始化

9.4.2 聚合 [dcl.init.aggr]
  1. 聚合是一个数组或带有...的类(第11条)

-2
投票

数组没有复制构造函数或复制赋值运算符。它们是不可修改的左值。

在第一个声明中

char a[] = ""; // ??? (copies array content)

数组

a
的元素由字符串文字
""
的元素初始化。这是通过字符串文字初始化字符数组所采用的一般规则的一个例外。

第二个声明

char q[] = a;  // copy-init (copies pointer)

编译器将根据答案开头指出的原因发出错误消息。

来自 C++ 17 标准(11.6.2 字符数组)

1 窄字符类型数组(6.9.1)、char16_t 数组、char32_t 数组或 wchar_t 数组可以由窄字符串文字初始化, char16_t 字符串文字、char32_t 字符串文字或宽字符串 分别或通过适当类型的字符串文字 用大括号括起来(5.13.5)。值的连续字符 字符串文字初始化数组的元素。 [ 示例:

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

显示一个字符数组,其成员用 a 初始化 字符串字面量。请注意,因为’ ’ 是单个字符并且 因为附加了尾随“ ”,所以 sizeof(msg) 为 25。 — 示例结束 ]

© www.soinside.com 2019 - 2024. All rights reserved.