【问题标题】:Notation for "reference to array" type“引用数组”类型的表示法
【发布时间】:2021-01-09 12:48:26
【问题描述】:

在 C++ 中,对数组的引用类型显示为 int (&) [10]。例如,当我尝试使用 g++ 编译并发出以下代码时

template <typename T> void foo(T&);

int main() {
    int a[] {1, 2, 3};

    foo(a);
}

我收到以下错误:

undefined reference to `void foo<int [3]>(int (&) [3])'

在这个错误文本中,为什么参数类型显示为int (&amp;) [3]?为什么我们不将数组引用类型表示为对整数类型或类类型的引用,即int [10] &amp;?使用(&amp;)的原因是什么?

我知道我们可以像这样定义一个“对数组的引用”变量:

int (&b)[3] = a;

而且这个定义确实“看起来像”b 的类型。但这是唯一的原因吗?符号int [10] &amp;有问题吗?

【问题讨论】:

  • @bloody 没有定义。我不是故意写定义,将参数 T& 的类型视为错误。此方法来自 Scott Meyers 的《Effective Modern C++》一书。
  • 但是T&amp;类型不是错误吗?您的问题仅仅是为什么语法不是(例如)void bar(int[10] &amp;array)
  • 如果您将函数定义为= delete;,您可以节省一些构建时间。不必等待链接器。
  • @Someprogrammerdude 我只是想知道符号的原因,即为什么类型显示为int (&amp;) [3] 而不是int [3] &amp;
  • 可能是因为它的语法不正确。如果编译器显示包含无效语法的错误消息,那就太糟糕了。

标签: c++ g++ clang


【解决方案1】:

它来自于数组指针的类型:int(*)[10]*&amp; 替换,就像在所有引用类型中一样。

指向数组的指针之所以如此,是因为它在 C 中的样子,而 C++ 没有理由改变它。

int (*a)[10];
// "(*a)[10]" is an int
// The type of `a` is `int (*)[10]`, just remove the name

除了与 C

【讨论】:

  • 我明白了。 ANSI C 标准实际上只是简单地说int (*) [3] 将是一个指向ints 数组的指针。这只是当时C标准委员会的决定。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-27
相关资源
最近更新 更多