为什么我可以这样做:
constexpr auto i_can() {
int a = 8;
a = 9;
//...
}
但我不能这样做:
constexpr auto i_cannot() {
std::array<int, 10> arr{};
//I cannot
arr[5] = 9;
}
我的问题是:
int
,为什么我不能改变数组内的int
?reference std::array<T, N>::operator[](size_t)
目前不是constexpr
。答案 0 :(得分:17)
C ++ 14引入了constexpr
函数内对象的修改。但是,在修改例如通过赋值的标量很好,通过成员函数修改类对象仍然需要该成员函数为constexpr
。不幸的是,正如您所提到的,当前的std::array
规范并未将非const
operator[]
声明为constexpr
。
因此,§7.1.5/ 5使你的定义格式不正确:
对于非模板,非默认
constexpr
函数[...],如果没有 存在参数值,以便调用函数[...] 可以是核心常量表达式的评估子表达式 (5.20),[...],该计划格式不正确;无需诊断。
如果您想要完整constexpr
,则可以临时使用更现代的实现。例如。 Constainer::Array
答案 1 :(得分:16)