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,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}有什么问题我想@paddy的意思是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。