我希望能够将const数组参数传递给C ++中的方法。
我知道当你将数组传递给方法时,它与将指针传递给数组的第一项是一样的,所以一种简单的方法就是使用指针。
void myMethod(int * const inTab)
但是有一个数组有时会更好,你可以编写数组的大小。
答案 0 :(得分:17)
您可以使用采用数组大小的模板:http://ideone.com/0Qhra
template <size_t N>
void myMethod ( const int (& intArray) [N] )
{
std::cout << "Array of " << N << " ints\n";
return;
}
编辑: 避免代码膨胀的一种可能方法是使用一个函数来获取指针和执行实际工作的大小:
void myMethodImpl ( const int * intArray, size_t n );
和一个调用它的简单模板,很容易内联。
template <size_t N>
void myMethod ( const int (& intArray) [N] )
{ myMethodImpl ( intArray, N ); }
当然,你必须找到一种方法来测试它总是被内联,但你确实获得了安全性和易用性。即使在不是这样的情况下,您也可以以相对较低的成本获得收益。
答案 1 :(得分:6)
按3.9.3:2
任何应用于数组类型的cv-quali firs都会影响数组元素类型,而不是数组类型(8.3.4)。
和8.3.4:1
任何 “cv-quali fi-seq数组N T”形式的类型被调整为“N cv-quali fi er-seq T的数组”,并且类似地 “T的未知界限阵列。”
另外,按照8.3.5:5
在 确定每个参数的类型,“T的数组”或“返回T的函数”类型的任何参数是 调整为“指向T的指针”或“指向函数返回T的指针”。
这意味着在一个采用数组参数的函数中,参数类型实际上是一个指针,因为3.9.3:2指针是非cv限定的:
void foo(const int parameter[10]) {
parameter = nullptr; // this compiles!
}
由于8.3.5:5
中的另一个子句,这不会影响函数本身的类型制作清单后 对于参数类型,在形成参数类型时,将删除修改参数类型的任何顶级cv-quali 功能类型。
因此,如果您希望能够使用cv限定符传递数组,那么必须通过引用:
void foo(const int (¶meter)[10]);
答案 2 :(得分:5)
不确定这是不是你问的问题,但也许这就是你要找的东西
void func (const int array[10])
{
//array[0] = 12345; // this wouldn't compile, so 'const' works
}
int main ()
{
int array[10];
func(array);
}
答案 3 :(得分:3)
如果你需要数组的大小:
template < std::size_t Size >
void myMethod( const int ( &inTab )[ Size ] );