【问题标题】:How to call a function with a reference to an unknown size array?如何调用引用未知大小数组的函数?
【发布时间】:2013-09-16 13:29:22
【问题描述】:

考虑一个有效的代码:

template<size_t size>
void by_numbered_reference(int (&array)[size]);

这个函数接受一个数组作为参数,编译器可以使用模板参数推导推导出它的大小。

现在定义这样的函数是有效的(在Apple clang 3.0版上测试):

void by_reference(int (&array)[], int size);

哪个(应该)接受对未知大小数组的引用作为参数。注意 int[]int[n] 是不同的类型,通常不兼容。

我找到调用此函数的唯一方法是:

int * array;
by_reference(reinterpret_cast<int(&)[]>(*array), array_size);
  1. 为什么语言接受对未知大小数组的引用作为有效的函数参数,而没有直接的方法来定义此类变量?
  2. 是否存在需要此语法的已知用例?
  3. 为什么应该改用void by_reference(int (*&amp;array), int size)

【问题讨论】:

  • "现在定义这样的函数绝对有效" 不,不是:error: parameter ‘array’ includes reference to array of unknown bound ‘int []’ (link)
  • 不过,clang 接受它。 IMO 它应该是有效的,它只是对不完整类型的引用。 reinterpret_cast 是另一个故事。
  • 你能注意哪个编译器抱怨声明吗?
  • "clang 接受它" != "绝对有效"
  • 不是您问题的答案,但您是否考虑过使用 std::array?为这种非常方便的类型定义一个模板 是完全合理的:所有的性能,没有任何令人头疼的问题。

标签: c++ arrays syntax


【解决方案1】:

您的假设是错误的,程序格式错误。参见 C++11 标准 8.3.5/8:

如果参数的类型包括“指向 T 的未知边界数组的指针”或“引用”形式的类型 到 T 的未知边界的数组,”程序格式错误。

clang 允许将其作为编译器扩展。例如,g++ 不会接受它。

但是,您可以使用模板来推断传递数组的大小:

template <std::size_t N>
void by_reference(int (&)[N])
{
    // whatever
}

【讨论】:

  • 模板解决方案将为每个给定的N 创建函数by_reference 的不同实例,不是吗?我不是说这是错的,只是觉得值得一提。
  • @PaperBirdMaster 是的,所有模板都是如此,这就是我没有明确指出这一点的原因。但你绝对是对的。
  • 对C也有效吗?
  • @knivil C99 标准 6.7.5.3/7 表示数组作为函数参数“应调整为合格的指向类型的指针”;对我来说,只有void by_pointer(int * arr) 是有效的。然而,即使有我能想到的所有警告和迂腐标志,gcc 仍然会愉快地接受void by_pointer(int arr[]),但sizeof(arr) 仍然是sizeof(int *)。因为我不是 C 专家,所以我不知道谁在这里。
  • @knivil ...我错了!见this question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多