我希望能够在C++中将const数组参数传递给一个方法。
我知道当你将一个数组传递给方法时,它与传递数组第一个项的指针相同,因此一种简单的方法是使用指针。
void myMethod(int * const inTab)
但有时使用数组更好,例如可以写入数组的大小。
我希望能够在C++中将const数组参数传递给一个方法。
我知道当你将一个数组传递给方法时,它与传递数组第一个项的指针相同,因此一种简单的方法是使用指针。
void myMethod(int * const inTab)
但有时使用数组更好,例如可以写入数组的大小。
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 ); }
当然,你需要找到一种方法来测试它是否总是能被内联,但你确实可以获得安全性和易用性。即使在它无法被内联的情况下,你也可以在相对较小的代价下获得好处。
myMethod
100次,就会得到100个不同的函数。代码膨胀立即发生。根据函数的实际操作,优化器可能会使用一个函数代替,但在大多数有用的情况下,我认为这是不成立的... - twalbergint x = intArray[N];
- Kevin MOLCARDN
需要实例化,我可能会采用@BoBTFish最初提出的方案。如果可能存在更多情况,我要么采取他的编辑中提出的另一种方式(通过传递大小作为额外参数),要么将数组及其大小包装在一个小结构体中,并传递对该结构体的引用/指针,以避免有太多的参数。像往常一样,没有一个万能的解决方案。 - twalberg根据3.9.3:2:
应用于数组类型的任何cv限定符都会影响数组元素类型,而不是数组类型(8.3.4)。
和8.3.4:1:
任何形式为“cv限定符序列N个T的数组”的类型都会调整为“N个cv限定符序列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限定符在形成函数类型时都将被删除。
因此,如果您想能够传递带有cv限定符的数组,则必须通过引用传递:
void foo(const int (¶meter)[10]);
如果您需要获取数组的大小:
template < std::size_t Size >
void myMethod( const int ( &inTab )[ Size ] );
我不确定这是否是您询问的内容,但也许这正是您所寻找的。
(该文本已翻译成中文,并且保留了HTML标记)void func (const int array[10])
{
//array[0] = 12345; // this wouldn't compile, so 'const' works
}
int main ()
{
int array[10];
func(array);
}
array = 0
虽然能编译通过,但这不是 OP 想要的。 - a3ffunc
内部的array=0
不会影响到外部。 - ricabvoid myMethod(const std::vector<int> &inTab);