在
C
中,你可以写
const char *result = "AB";
C++
标准支持这种风格吗?这个常量字符串的生命周期是否与指针的相同作用域一起得到保证?
文字字符串常量具有整个程序的生命周期,并且存储字符串的数组永远不会超出范围。
请注意,C 和 C++ 中的文字字符串之间存在语义差异:在 C++ 中,文字字符串存储在 constant 字符的数组中(因此需要
const
中的 const char*
)。在 C 中,它们不是常量数组(所以 char *
在 C 中是可以的)。但是,不允许修改 C 中的文字字符串,这使得它们只读(但不是常量)。
引用
C++17
,第§ 5.13.5章(强调我的)
普通字符串文字和 UTF-8 字符串文字也称为窄字符串文字。一个箭头 字符串文字的类型为“n const char 的数组”,其中 n 是字符串的大小,如下定义,并且具有 静态存储时间
并且,对于静态存储持续时间,第 § 6.7.1 章
所有没有动态存储持续时间、没有线程存储持续时间的变量 不是本地的有静态存储持续时间。 这些实体的存储应在有效期内持续 程序。
因此,字符串文字的生命周期是程序的整个执行过程,它永远不会超出范围。
这个常量字符串的生命周期是否与指针的相同作用域一起得到保证?
不,字符串文字的生命周期与指向它们的指针的生命周期无关; 字符串文字存在于程序的整个生命周期中。
字符串文字具有静态存储持续时间,因此在程序的生命周期中都存在于内存中。
6 在第 6 阶段翻译之后,出现一个不以 编码前缀是普通的字符串文字。一根普通的字符串 文字的类型为“n 个 const char 的数组”,其中 n 是数组的大小 字符串如下定义,具有静态存储持续时间([basic.stc]), 并用给定的字符初始化。 15 计算 string-literal
字符串常量(文字)与整个程序具有相同的生命周期。从指针被创建之前到它被销毁之后
在 Linux 世界中,字符串文字将放置在 ELF 文件的
.rodata
drazen@HP-ProBook-640G1:~/proba$ readelf -x .rodata proba
Hex dump of section '.rodata':
0x00002000 01000200 414200 ....AB.