如何在函数中传递常量变量?
How to pass a const variable in a function?
似乎函数中传递的参数无法保持其常量属性。 假设我需要使用函数中参数中的信息初始化一个 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++中,const
和constexpr
之间有区别: "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);
}
相关文章:
- 通过多个头文件使用常量变量
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 非常量变量只读位置的赋值
- 使用大量已知常量变量的正确方法
- 无法在具有常量变量大小的类中创建堆栈分配数组
- 这些语句是否等效(静态变量、常量变量和泛型)
- 包含常量变量并包含在多个文件中的标头的链接错误
- 我们如何修改常量变量的值
- 如何在模板类中设置静态常量变量
- 为什么常量变量是模板特殊化所必需的,而不是常量
- 如何在函数中传递常量变量?
- 定义常量变量的最佳方法
- C++ 声明常量变量,但推迟其初始化?
- 如何初始化具有常量变量的结构数组
- 使用常量变量作为维度将矩阵声明为类成员时出现编译器错误
- 使用指针 c++ 更改常量变量
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 为什么 lambda 对象中的局部变量是常量变量?
- 使用常量变量作为数组的大小
- 为许多类可能需要的所有常量变量制作独立的头文件是否是一种很好的做法?