Why does the std::size on an array passed by value do not work?(为什么通过值传递的数组上的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 * )
通常等于4
或8
,具体取决于使用的系统。
如果您有这样的声明,您应该更改它,指定第二个参数,该参数将保持传递的数组中的元素数量,如
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不起作用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么通过值传递的数组上的std::size不起作用?
基础教程推荐
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++,'if' 表达式中的变量声明 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 设计字符串本地化的最佳方法 2022-01-01