constexpr修饰规则疑问:作用于指针还是底层char值?
关于constexpr修饰指针的疑问解答
核心问题解析
在表达式
constexpr char* master_lobby_server_address = "192.4.4.2";中,constexpr修饰的是指针本身,它让指针变量成为编译期常量,但不会修饰底层的char值。也就是说,指针存储的地址是编译期确定的,但它指向的字符内容并没有被设为const。为什么和const的修饰规则不同?
- const的修饰逻辑依赖位置:
const char* my_pointer;中const修饰的是指向的char值,char* const my_pointer;中const修饰的是指针本身; - 而constexpr是直接作用于整个变量,不管它在指针符号的左侧还是右侧,核心是让变量(这里就是指针)成为编译期可求值的常量。对指针来说,constexpr只保证指针的地址值在编译期可知,不影响指向对象的const属性。
- const的修饰逻辑依赖位置:
为什么
constexpr const char* master_lobby_server_address = "666";是惯用且可编译的写法?- C标准规定字符串字面量的类型是
const char[N](N包含字符串长度和终止符),直接将其赋值给char*属于把const对象绑定到非const指针,这是标准不允许的(早期C有兼容,但C11后明确弃用,Visual Studio会直接报错); - 加上
const后,const char*匹配字符串字面量的类型,同时constexpr保证指针本身是编译期常量,既符合类型安全要求,也满足编译期求值的规则,这才是合规的写法。
- C标准规定字符串字面量的类型是
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

