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

新手上路,请多包涵

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

我知道,当您将数组传递给方法时,它与将指针传递给数组的第一项相同,因此一种简单的方法是使用指针。

 void myMethod(int * const inTab)

但是有时拥有一个数组会更好,例如,您可以编写数组的大小。

原文由 Kevin MOLCARD 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 724
2 个回答

您可以使用获取数组大小的模板: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 ); }

当然,您必须找到一种方法来测试它是否始终被内联,但您确实获得了安全性和易用性。即使在不是的情况下,您也可以以相对较小的成本获得好处。

原文由 BoBTFish 发布,翻译遵循 CC BY-SA 3.0 许可协议

每 3.9.3:2

任何应用于数组类型的 cv 限定符都会影响数组元素类型,而不是数组类型 (8.3.4)。

和 8.3.4:1

任何形式的“cv-qualifier-seq array of NT”都被调整为“array of N cv-qualifier-seq T”,同样适用于“array of unknown bound of 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 (&parameter)[10]);

原文由 ecatmur 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题