constexpr指针指向constexpr数组触发非常量表达式编译错误
问题分析与解决
1. 数组初始化的优化点
你代码里的constexpr char array[]={"my string"};写法虽语法合法,但更简洁的常规写法是去掉大括号:
constexpr char array[] = "my string";
不过这并非编译失败的核心原因。
2. constexpr指针初始化的核心错误
编译失败的关键在于:局部自动存储期的constexpr数组的地址,无法用来初始化constexpr指针。
你的array是main函数内的局部变量,属于自动存储期(栈上分配),每次程序运行时它的内存地址都可能变化,不符合常量表达式“编译时确定值”的要求。
解决方法
将数组改为静态存储期,有两种可行方式:
- 给数组添加
static修饰,使其成为局部静态变量:
int main() { static constexpr char array[] = "my string"; constexpr const char* ptr = array; }
- 将数组移至全局作用域(全局变量默认是静态存储期):
constexpr char array[] = "my string"; int main() { constexpr const char* ptr = array; }
为何尝试的几种指针声明都无效?
不管是constexpr const char*、constexpr char*还是constexpr char* const,问题根源都不在指针的const限定符,而是指针指向对象的存储期。只要对象是自动存储期的局部变量,它的地址就不能作为常量表达式初始化constexpr指针,因此更换指针声明方式无法解决问题。
内容的提问来源于stack exchange,提问作者Dennis1234
相关产品推荐
相关产品推荐

