【问题标题】:Why the c++ function can return array’s size correctly? [duplicate]为什么 c++ 函数可以正确返回数组的大小? [复制]
【发布时间】:2018-08-28 13:20:25
【问题描述】:

我正在学习关于 constexpr 的 c++11。 所以我去了网站并学习了如何编码。当我学习如何编码时。我提出了一个关于返回数组的大小函数的问题。我认为它是功能性的,但我不知道如何写成这样。 这是我的代码:

#include <iostream>

constexpr auto newline = "\n";

template < typename Type , uint32_t SZ>
constexpr uint32_t len(const Type (&array)[SZ])
{
    return SZ;
}

int main()
{
    int* ptr = new int (9);
    int array[] = {1,2,3,4,5,*ptr};
    std::cout << len(array) << newline;
}
/*
Output:
6

*/

我想知道为什么 len 函数正确返回数组的大小。

【问题讨论】:

  • 你是在问这个特殊的 sn-p 是如何推导出数组长度的吗?以及如何将这些信息传递回调用者?还是什么?
  • “为什么”是什么意思?为什么不?编译器的编写方式是编译成给出正确答案的代码。
  • 请注意,SZ 的适当类型是 std::size_tstd::uint32_t 可能与 std::size_t 相同,但这不是必需的,有时也不是这样。

标签: c++ function arguments constexpr


【解决方案1】:
  • 数组的类型为int[6](我知道你在声明中省略了[6],但这仍然是真的)
    • 请注意,大小是类型的一部分
  • 通过引用传递数组可防止衰减到指针
    • 引用类型为 int (&amp;)[6](您添加了一个 const 以作为衡量标准)
  • 函数实际上是一个模板,取const T (&amp;)[N],其中TN都是参数
    • 这样的模板调用可以推导出模板参数,所以N会被自动检测到!
    • 你也可以打电话给len&lt;int, 6&gt;(array),但这更没有意义……
  • N 的值随后作为简单数字从函数返回。

N 应该是 std::size_t,但不是 std::uint32_t

【讨论】:

    【解决方案2】:

    SZ 是一个模板参数。编译器知道用于实例化模板的参数。

    参数不需要显式指定,因为可以从非模板参数array的类型推导出来。参数表达式的类型是int[6]。请注意,数组的大小是数组类型的一部分。

    为了进一步学习,我建议学习“模板参数推导”这个主题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-06
      • 2017-09-05
      • 2017-06-16
      • 2015-12-13
      • 2018-10-19
      • 2013-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多