为什么通过值传递的数组上的std::size不起作用? [英] Why does the std::size on an array passed by value do not work?

查看:51
本文介绍了为什么通过值传递的数组上的std::size不起作用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么std::size()在通过值传递的静态分配数组上不起作用?

void print_elemTab(int tab[])
{
   // ...
   int size = std::size(tab); //error 
   // ...
}

void test_tab()
{
   const int    TAB_SIZE = 5;
   int          tab[TAB_SIZE] = {};
   // ...
   cout << std::size(tab) << std::endl; //print 5
   print_elemTab(tab);
   // ...
}

我正在打印尺寸,然后再次使用std::size()时传递的子函数print_elemTab()中的tab

我收到无匹配函数错误,所以我想知道为什么std::size()第一次在test_tab()中起作用,而不是在print_elemTab()

中起作用

我必须通过引用传递它吗?如果不是任何长度的数组,我该怎么做呢?

还是因为我没有意识到的事情,我必须以其他方式制作?

推荐答案

表达式中使用的数组指示符被隐式转换为指向其第一个元素的指针(极少数例外,例如在sizeof运算符中使用它们)。

因此在此调用中

print_elemTab(tab);

参数表达式的类型为int *

另一方面,具有数组类型的函数参数由编译器调整为指向数组的元素类型。

例如,这些函数声明

void     print_elemTab(int tab[]);
void     print_elemTab(int tab[5]);
void     print_elemTab(int tab[100]);

声明相同的一个函数,并等同于以下声明

void     print_elemTab(int *tab);

您甚至可以在程序中包含所有这些声明,尽管编译器可能会发出一条消息,指出存在多余的声明。

因此,在函数中,您要处理的是int *类型的指针。而sizeof( int * )通常等于48,具体取决于使用的系统。

如果您有这样的声明,您应该更改它,指定第二个参数,该参数将保持传递的数组中的元素数量,如

void     print_elemTab(int *tab, size_t n );

并且该函数可以像这样调用

print_elemTab(tab, std::size( tab ) );

另一种方法是通过引用传递数组。在这种情况下,您应该声明一个模板函数,例如

template <size_t N>
void     print_elemTab( int ( &tab )[N] );

在函数中,您可以直接使用模板参数N作为数组中的元素数。或者,您可以将相同的标准C++函数std::size应用于数组。

或者该函数甚至可以用第二个模板类型参数声明,如

template <typename T, size_t N>
void     print_elemTab( T ( &tab )[N] );

另一种方法是像

那样声明函数
template <typename Container>
void     print_elemTab( Container &container );

在这种情况下,您还可以将标准函数std::size应用于参数容器。

这篇关于为什么通过值传递的数组上的std::size不起作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆