由于我不知道数组的大小,所以我使用size
作为参数传递给我的函数。
这有效:
#include <cstddef>
#include <iostream>
template<class T, size_t N>
void takeArrayParam(T (&myArray)[N]) {
for(auto i = std::begin(myArray); i != std::end(myArray); i++) {
std::cout << *i << std::endl;
}
}
int main() {
int coolArray[10] = {1,2,3,4,5,6,7,8,9,10};
takeArrayParam<int, 10>(coolArray);
return 0;
}
这不起作用(编译错误):
#include <cstddef>
#include <iostream>
template<class T, size_t N>
void takeArrayParam(T (&myArray)[N]) {
for(auto i = std::begin(myArray); i != std::end(myArray); i++) {
std::cout << *i << std::endl;
}
}
int main() {
size_t size = 10;
int coolArray[size];
//int coolArray[10] = {1,2,3,4,5,6,7,8,9,10};
takeArrayParam<int, size>(coolArray);
return 0;
}
差异:coolArray[10]
与coolArray[size]
。
...谢谢
答案 0 :(得分:3)
您需要将const
添加到main()中的size
定义中
这是因为在编译时需要知道堆栈上分配的数组的大小。
答案 1 :(得分:2)
问题是size
不是constant expression(在编译时已知),在您的情况下使用const
或{{1}声明它会解决你的问题:
constexpr
在这种情况下使用constexpr size_t size = 10;
起作用,因为您使用文字const
进行初始化,这是一个常量表达式。这在C ++标准部分10
expr.const 草案中有所说明:
条件表达式是核心常量表达式,除非它 涉及以下之一作为潜在评估的子表达式
并包含以下项目符号:
左值 - 右值转换(4.1),除非它适用于
- 一个整数或枚举类型的glvalue,它引用具有前面初始化的非易失性const对象,已初始化 用一个常量表达式,或
请注意,数组大小也必须是常量表达式:
5.19
正如我在回答Does “int size = 10;” yield a constant expression?几个编译器支持variable length arrays( VLA )时所说的那样,这是一个C99功能作为C ++的扩展,但它不可移植,特别是Visual Studio不支持VLA。