C++ 如何通过一些计算创建常量数组

C++ 如何通过一些计算创建常量数组,c++,C++,我有密码 int a[5]; for (int i = 0; i < 5; i++){ a[i] = i * i; } inta[5]; 对于(int i=0;i CONTXPRP .< /P> < P>使用现代C++(数组< /COD>和立即调用的lambda(IIL)),可以实现: const auto a = []() { std::array< int, 5 > x; for (int i = 0; i < 5; i++) {

我有密码

int a[5];
for (int i = 0; i < 5; i++){
    a[i] = i * i;
}
inta[5];
对于(int i=0;i<5;i++){
a[i]=i*i;
}

有没有办法使此数组保持常量,以便其他代码可以使用它,但不能更改它。

最简单的方法是使用
constepr
函数和
std::array

constexpr std::array<int, 5> make_array() {
    std::array<int, 5> a{};
    for (int i = 0; i < 5; i++){
        a[i] = i * i;
    }
    return a;
}
//...
const std::array<int, 5> a = make_array();
constepr std::array make_array(){
std::数组a{};
对于(int i=0;i<5;i++){
a[i]=i*i;
}
返回a;
}
//...
const std::array a=make_array();
注意。如@ M.M所指出的,此代码仅适用于C++ 17,如前C ++ 17,运算符[]/COD>数组上不是“代码> CONTXPRP</代码> .< /P> < P>使用现代C++(<代码>数组< /COD>和立即调用的lambda(IIL)),可以实现:

const auto a = []() 
{
    std::array< int, 5 > x;

    for (int i = 0; i < 5; i++)
    {
        x[i] = i * i;
    }

    return x;
}(); // IIL
const auto a=[]()
{
std::数组x;
对于(int i=0;i<5;i++)
{
x[i]=i*i;
}
返回x;
}(); // IIL
使用lambda比函数调用有好处,您可以将局部变量捕获到lambda中并使用它们,而无需通过参数传递值(
[&]
[=]
而不是
[]


就像函数一样,lambda可以很容易地内联到代码中,因此没有开销。

constepr std::array
-从这里开始。不要使用C样式的数组。也;语言有<代码> conconsCAST ,所以你永远不能肯定100%的人不会对你的<代码> const (不幸的)C或C++进行恶意的事情。选择一个。细节:C没有常量数组。C没有
const
数组。接受更改
常量
数组的元素是未定义的行为。它可能会工作,可能不会,可能会杀死代码。这就是你的代码吗?
constinta[5]={0,1,2,4,8}有什么问题constinta[5]={0,1,4,9,16}.Constexpr在这里并不真正需要。解决方案的jist是将初始化提升到一个函数中。注意:在C++17之前,当执行
运算符[]
时,此代码是未定义的行为NDRconstexpr@NathanOliver这确实会有所不同。例如,如果
a
是一个全局变量,则在gcc上缺少constexpr会生成运行时初始化,而使用constexpr会静态初始化aray。@M.M两个编译器的godbolt上都没有诊断:@M.M ah!不同的方言。我现在总是用C++17。