下面的代码是否正确?
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/