在constexpr函数内变换int

时间:2015-08-09 10:03:54

标签: c++ c++14 constexpr

为什么我可以这样做:

constexpr auto i_can() {
   int a = 8;
   a = 9;
   //...
}

但我不能这样做:

constexpr auto i_cannot() {
    std::array<int, 10> arr{};
    //I cannot
    arr[5] = 9;
}

我的问题是:

  1. 如果我可以改变int,为什么我不能改变数组内的int
  2. 这是语言限制(C ++ 14)还是标准库规范问题? reference std::array<T, N>::operator[](size_t)目前不是constexpr

2 个答案:

答案 0 :(得分:17)

C ++ 14引入了constexpr函数内对象的修改。但是,在修改例如通过赋值的标量很好,通过成员函数修改类对象仍然需要该成员函数为constexpr。不幸的是,正如您所提到的,当前的std::array规范并未将非const operator[]声明为constexpr。 因此,§7.1.5/ 5使你的定义格式不正确:

  

对于非模板,非默认constexpr函数[...],如果没有   存在参数值,以便调用函数[...]   可以是核心常量表达式的评估子表达式   (5.20),[...],该计划格式不正确;无需诊断。

如果您想要完整constexpr,则可以临时使用更现代的实现。例如。 Constainer::Array

答案 1 :(得分:16)

这是标准库的限制,因为可以修改constexpr中的普通C数组:

#include <iostream>

constexpr auto demo()
{
   int arr[10] = {};
   arr[5] = 9;
   return arr[5];
}

int main()
{
    static_assert(demo() == 9, "");
    std::cout << demo() << std::endl;
    return 0;
}   

DEMO

<强>输出

9

如果您将constexpr添加到operator[]的{​​{1}}实施内容中,您也可以在array内使用此运算符。

DEMO