c++ - 使用 constexpr 初始化非常量静态字符串

标签 c++ c++17

下面的代码是否正确?

constexpr char s[] = "a, bb, ccc";
static const char * s1 = s;
char * s2 = const_cast<char *>(s1);
s2[5] = 'x';

我的第一个想法是“s”仅在编译时存在,“s1”可能是“s”的某种拷贝,但可能不太正确,因为第 2 行在没有“const”的情况下无法编译:

static char * s1 = s;

MSCV2017 的错误是:'initializing': cannot convert from 'const char [11]' to 'char [11]'。

所以不清楚's'和's1'之间的关系是什么?它们引用相同的字符串文字吗?

最佳答案

定义

static const char * s1 = s;

等于

static const char * s1 = &s[0];

也就是你让s1指向s的第一个元素,仅此而已。没有进行“复制”。

这就是为什么您不能使用指向非常量(即 char *)的指针,因为 s1 将指向常量数据。

这也是为什么当您尝试修改常量数据时 s2[5] = 'x' 会导致未定义的行为

关于c++ - 使用 constexpr 初始化非常量静态字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55572831/

相关文章:

c++ - 在文本文件中逐行向前移动 (c++)

c++ - 当不支持可变模板参数时,如何为元组专门化类模板?

c++ - 模板内嵌套类型名称的流运算符重载

c++ - 为什么按值传递的数组上的 std::size 不起作用?

c++ - 在 C++ 中使用 __asm 将 short 类型的变量移动到 EAX(VS 2010)

C++ - 在保持灵活代码的同时处理隐式/显式转换

c++ - 我应该怎么做而不是函数模板的部分特化?

c++ - 安装 GCC 7.1 会在标准库中包含 std::is_base_of_v 吗?

c++ - 默认值输入错误的构造函数不会引发 GCC 7 错误

c++ - 如何让MSVC编译器优化多步POD初始化?