所以,根据 CPP 参考,我应该能够使用
data()
作为 constexpr。我的最小例子是这样的:
#include <array>
#include <iostream>
int main(int argc,char** argv){
using Container_t = std::array<double, 10>;
constexpr Container_t arr{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
constexpr const double* data = arr.data();
return arr[0];
}
并且这是此代码产生的编译错误。我在所有主要编译器上都看到类似的错误,所以我一定错过了规范允许的内容,但这似乎是一个简单的情况。谢谢!
A
constexpr
指针必须指向具有静态存储持续时间的对象。
您的
arr
没有固定地址,因为它是局部变量,因此 arr.data()
不能是常量表达式。
它可以用作常量表达式的部分:
constexpr Container_t arr{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
static_assert(arr.data()[2] == 3.0);
static_assert(arr.data() + 3 == &arr[3]);
如果希望它是常量表达式,请使
arr
具有静态存储持续时间:
static constexpr Container_t arr{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
constexpr const double* data = arr.data();