【问题标题】:In regards to array size calculation [duplicate]关于数组大小计算[重复]
【发布时间】:2011-02-17 19:17:42
【问题描述】:

可能重复:
Can someone explain this template code that gives me the size of an array?

您好,我正在查看此处发布的答案:

Computing length of array

复制到这里:

template <typename T, std::size_t N>
std::size_t size(T (&)[N])
{
    return N;
}

有人能解释一下 (&) 的意义吗?

【问题讨论】:

  • 这是一个不同的问题。
  • @RobertHarvey:不,它们是相同的,但措辞不同。这特别调出&,而另一个询问维度,但维度由于引用而具有意义。注意“当我传递数组时会发生什么”(另一方面)直接回答为“'&'的重要性(从这里)意味着它是通过引用传递的”。
  • 让我们保持打开状态。这两个问题的答案大相径庭,最接近的原因是“完全重复。”
  • @RobertHarvey:我不明白如果没有一个人从另一个人复制文字文本,它们怎么能更接近重复。但是,无论如何,它们现在将从上面自动插入的评论中链接起来。
  • @Fred:抱歉,找错地方了。

标签: c++


【解决方案1】:

&amp; 表示数组是通过引用传递的。这可以防止类型衰减为指针。如果不通过引用传递,您将得到衰减,并且没有关于数组大小的信息。

非模板示例:

void foo( int (&a)[5] )
{
    // whatever
}

int main()
{
    int x[5];
    int y[6];

    foo( x );           // ok
    //foo( y );         // !incompatible type
}

干杯,

【讨论】:

  • 谢谢。同意,我对 & 周围的括号更感到困惑。为什么需要它们?我测试过,没有它们编译失败..
  • 更好的解释。所以删除了我的!
  • 为清楚起见,在不通过引用传递的情况下,给定维度只是一个提示,实际上并不是参数类型的一部分。也就是说,void foo(int a[5]) 与 void foo(int *a)完全相同。当为这个非引用形式调用 foo(x) 时,你会得到提到的数组到指针的衰减。
  • @Kiran:如果没有括号,您将尝试声明一个引用数组,这是不允许的:您不能有一个引用数组。
【解决方案2】:

& 表示要通过引用传递数组。数组不能按值传递,因为在这种情况下,它们会衰减为指向第一项的指针。如果发生这种情况,与数组类型相关的大小信息就会丢失。

它在括号中,否则这将意味着函数接受指向引用的指针。虽然这样的事情在 C++ 中是不合法的,但语法与您声明指向数组的指针的方式是一致的。

int (*arr)[3]; // pointer to array of 3 ints
int* p_arr[3]; // array of pointers

int (&arr)[3]; // reference of array of 3 ints
int& r_arr[3]; //array of references (not legal in C++)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2020-10-04
    • 1970-01-01
    • 2010-10-17
    • 2021-08-02
    • 1970-01-01
    相关资源
    最近更新 更多