如何在函数中传递常量变量?

How to pass a const variable in a function?

本文关键字:常量 变量 函数      更新时间:2023-10-16

似乎函数中传递的参数无法保持其常量属性。 假设我需要使用函数中参数中的信息初始化一个 const 变量,然后创建一个数组类型。我该怎么办?

例:

#include <array>
using namespace std;
void foo(const int info)
{
const int num = info + 1;  // seems num cannot be constant
array<int, num> arr;
}

编译错误:

test.cpp: In function ‘void foo(int)’:
test.cpp:8:16: error: the value of ‘num’ is not usable in a constant expression
array<int, num> arr;
^
test.cpp:7:15: note: ‘num’ was not initialized with a constant expression
const int num = info + 1;  // seems num cannot be constant
^

更新: 使用数组类型会导致这样的麻烦,但使用简单类型数组就可以了:

void foo(int info)
{
int array[info];
}

info不应该在编译时分配吗?

在C++中,constconstexpr之间有区别: "constexpr"和"const"之间的区别

在您的情况下,您正在尝试创建一个编译时大小的数组,这需要一个 constexpr。 constexpr 不能简单地是一个 const 变量函数参数。 您可以改用constexpr,也可以使用vector(运行时大小的数组(而不是array

如果你用gcc -pedantic编译,你会发现int array[info]也不是标准的C++。请参阅 GCC 文档。

实现问题目标的一种方法是使用非类型模板参数:

#include <array>
template<int info>
void foo()
{
constexpr int num = info + 1;
std::array<int, num> arr; // or int arr[num]
}
// Call as foo<3>()

如果你需要一个动态大小的数组,并且你不需要std::array的特定属性,你可以只使用vector。

主要区别在于:

std::array 是一个模板类,它封装了一个静态大小的 数组,存储在对象本身内部,这意味着,如果您 在堆栈上实例化类,数组本身将在 叠。它的大小必须在编译时知道(它作为 模板参数(,并且它不能增大或缩小。

但是,向量内部存储在堆上。

寄件人: https://stackoverflow.com/a/4424658/128581

此外,如果类型 T 是微不足道的可复制的,则 std::array 是微不足道的可复制的(这意味着您可以毫不担心地将它从一个地方复制到另一个地方(。

使用矢量,例如:

void foo(size_t size)
{
vector<int> arr(size);
}