将数组作为C++中方法的const参数传递

Kev*_*ARD 10 c++ arrays methods arguments const

我希望能够将const数组参数传递给C++中的方法.

我知道当你将一个数组传递给方法时,它与将指针传递给数组的第一项是一样的,所以一种简单的方法就是使用指针.

void myMethod(int * const inTab)
Run Code Online (Sandbox Code Playgroud)

但是有一个数组有时会更好,你可以编写数组的大小.

BoB*_*ish 18

您可以使用采用数组大小​​的模板:http://ideone.com/0Qhra

template <size_t N>
void myMethod ( const int (& intArray) [N] )
{
    std::cout << "Array of " << N << " ints\n";
    return;
}
Run Code Online (Sandbox Code Playgroud)

编辑:避免代码膨胀的一种可能方法是使用一个函数来获取指针和执行实际工作的大小:

void myMethodImpl ( const int * intArray, size_t n );
Run Code Online (Sandbox Code Playgroud)

和一个调用它的简单模板,很容易内联.

template <size_t N>
void myMethod ( const int (& intArray) [N] )
    { myMethodImpl ( intArray, N ); }
Run Code Online (Sandbox Code Playgroud)

当然,您必须找到一种方法来测试它总是内联,但您确实获得了安全性和易用性.即使在不是的情况下,您也可以以相对较低的成本获得收益.


eca*_*mur 7

按3.9.3:2

应用于数组类型的任何cv-quali firs都会影响数组元素类型,而不是数组类型(8.3.4).

和8.3.4:1

任何类型的形式"NT的cv-quali fi-seq数组"被调整为"N cv-quali-erq-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!
}
Run Code Online (Sandbox Code Playgroud)

这不会影响函数本身的类型,因为8.3.5:5中的另一个子句

生成参数类型列表后,在形成函数类型时,将删除修改参数类型的任何顶级cv-quali.

因此,如果您希望能够使用cv限定符传递数组,则必须通过引用:

void foo(const int (&parameter)[10]);
Run Code Online (Sandbox Code Playgroud)


Tor*_*zki 5

如果您需要数组的大小:

template < std::size_t Size >
void myMethod( const int ( &inTab )[ Size ] );
Run Code Online (Sandbox Code Playgroud)


Des*_*ume 5

不确定这是不是你问的问题,但也许这就是你要找的东西

void func (const int array[10])
{
    //array[0] = 12345; // this wouldn't compile, so 'const' works
}

int main ()
{
    int array[10];
    func(array);
}
Run Code Online (Sandbox Code Playgroud)