C++类成员函数间传递constexpr常量作为数组索引的编译错误问题
解决类成员函数返回值作为数组大小的编译错误
你遇到的问题核心是:试图用非静态constexpr成员函数的返回值声明栈数组,但编译器无法在编译期确定这个值。我来帮你拆解原因和修复方案:
问题根源
你的siz()是非静态成员函数,哪怕标记了constexpr,在abc()里调用它时,编译器需要依赖this指针(指向当前对象实例)来执行函数——而this是运行期才会确定的,没办法在编译期完成常量求值。这就导致编译器无法确认siz()的返回值是编译期常量,自然不能用来声明栈上的固定大小数组。
另外,你原来的siz()函数还有个小疏漏:只定义了变量sizz,但没有return语句,这会导致未定义行为,哪怕是constexpr函数也必须明确返回值哦。
修复方案
这里有几个简单可行的解决思路,你可以根据需求选择:
方案1:将siz()改为静态constexpr成员函数
静态成员函数不需要依赖具体对象实例,编译期就能直接求值。修改后的代码如下:
class bin { public: static constexpr int siz(); // 改为静态成员函数 void abc(); }; constexpr int bin::siz() { return sizeof(int) * 8; // 补充return语句返回常量值 } void bin::abc() { char arr[bin::siz()]; // 通过类名直接调用静态函数 // 也可以简化为char arr[siz()]; 成员函数内可直接访问静态成员 }
方案2:直接定义静态constexpr常量
既然siz()的返回值是固定的(sizeof(int)*8),没必要用函数包装,直接定义静态常量更简洁:
class bin { public: static constexpr int sizz = sizeof(int) * 8; void abc(); }; void bin::abc() { char arr[bin::sizz]; }
内容的提问来源于stack exchange,提问作者Anselmo GPP
相关产品推荐
相关产品推荐

