【问题标题】:C++ array decay don't happen for reference why?C++ 数组衰减不会发生以供参考,为什么?
【发布时间】:2015-10-22 18:15:16
【问题描述】:

我正在阅读有关 C++ 的内容,发现当我们通过引用传递数组时,不会发生数组到普通非 const 指针的转换(技术上称为衰减)。这个限制有什么原因吗?

我知道在 C99 中发生数组衰减的三种基本情况,即:

当它是 & (address-of) 运算符的参数时。

当它是 sizeof 运算符的参数时。

当它是 char [N + 1] 类型的字符串文字或 wchar_t [N + 1] 类型的宽字符串文字(N 是字符串的长度)时,用于初始化数组,如 char str [] = "富";或 wchar_t wstr[] = L"foo";.

此外,在 C11 中,新引入的 alignof 运算符也不会让它的数组参数衰减为指针。

在 C++ 中,还有其他规则,例如,当它通过引用传递时。

谢谢

【问题讨论】:

  • 你希望它衰减到什么程度?
  • 首先你必须解释你在说什么限制。
  • @anonymous 你遇到了什么错误?
  • 另外,数组在传递给sizeof 运算符时不会衰减。
  • 更好的问题可能是为什么数组如此损坏以至于int x[4] 不可复制,但struct { int x[4]; } 是...

标签: c++ c++11


【解决方案1】:

数组到指针的衰减产生一个右值。因此,出于显而易见的原因,它仅在右值上下文中才有意义。

引用上下文自然是左值上下文,这就是为什么数组到指针衰减在这种上下文中毫无意义的原因。

【讨论】:

    【解决方案2】:

    简单的答案是类型安全,这是 C++ 的支柱之一。在某些情况下出现衰减的唯一原因是 C 兼容性。

    【讨论】:

    • 无论如何通过引用传递时衰减到数组是什么意思?
    • @PeterSchneider 那么数组将不会通过引用传递。
    • 这不仅仅是 C 兼容性。数组对于函数调用(即无模板)几乎毫无用处,因为只能使用给定长度的数组调用给定函数。就好像向量的长度是模板的模板参数一样。
    • @juanchopanza 当然,它已经通过引用传递了,即使在 C 中也是如此。当然,可怜的人的参考。如果将传递数组 arg 与传递 struct arg 进行对比,它应该会变得很明显。
    • @PeterSchneider 我不知道你在说什么。我们在谈论 C++,所以“引用”的含义实际上很重要。在 C++ 中传递指针是按值传递。
    猜你喜欢
    • 2016-01-22
    • 2014-08-24
    • 2016-02-17
    • 2020-10-07
    • 2023-02-24
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多