gpt4 book ai didi

c++ - sizeof 和按引用传递

转载 作者:太空宇宙 更新时间:2023-11-03 10:34:25 24 4
gpt4 key购买 nike

我希望有人能解释以下行为。

假设我正在尝试实现一个确定任何数组长度的函数,但想避免使用宏。例如

#define array_length(x) ( sizeof(x) / sizeof(x[0]) )

鉴于该函数必须使用任何参数类型,我必须使用模板。

我的第一次尝试看起来像这样。

template <typename T>
inline size_t
array_length(const T argument) {
return sizeof(argument) / sizeof(argument[0]);
}

这不起作用,因为参数被视为指针。一旦 T 更改为 T&,一切正常。

我想知道是否有人可以说说语言实现层面发生的事情。例如,当引用用作函数参数时,向函数传递了哪些额外信息?

最佳答案

让我们考虑两个函数模板:

template <typename T> void f(T);
template <typename T> void g(T const&);

假设我们有一个数组:

int a[10];

当我们调用 f(a); 时会发生什么?由于我们没有显式地为模板提供参数,参数推导开始,编译器试图根据参数找出 T 是什么。参数的类型为 int[10]T 永远不会被推断为引用类型,并且您不能按值传递数组,因此会发生数组到指针的隐式转换,并且 T 被推断为int*.

当我们调用 g(a); 时会发生什么?同样,参数推导用于确定 T 是什么。不过,该参数的类型是T 的引用,因此T 可以直接推断为int[10] 并且不会进行数组到指针的转换。

请注意,查找数组长度的最佳解决方案是明确要求模板获取数组:

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

关于c++ - sizeof 和按引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7032080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com