如何将零大小的数组传递给模板函数
How to pass an array of zero size to template function
我有一个示例函数,它引用了一个数组。函数定义中的元素数未知。
template<typename T, std::size_t N>
void someFun(T (&)[N])
{
/* ... */
}
为一个元素的数组调用此函数编译得很好。推导出的参数类型为 int (&)[1]
。
int main()
{
int arr[1];
someFun(arr);
}
问题是,当我尝试传递一个零元素数组时。下面的示例显示了代码和错误。
int main()
{
int arr[0];
someFun(arr);
}
编译错误(使用 g++ 7.2(:
../src/main.cpp: In function 'int main()':
../src/main.cpp:24:13: error: no matching function for call to 'someFun(int [0])'
someFun(arr);
^
../src/main.cpp:9:6: note: candidate: template<class T, long unsigned int N> void someFun(T (&)[N])
void someFun(T (&a)[N])
^~~~~~~
../src/main.cpp:9:6: note: template argument deduction/substitution failed:
make: *** [src/main.o] Error 1
我假设推导的模板参数类型是int (&)[0]
,但是这个参数的替换失败了。我可以通过重载someFun
来绕过.这是我的工作示例:
template<typename T, std::size_t N>
void someFun(T (&)[N])
{
/* ... */
}
template<typename T>
void someFun(T (&)[0])
{
/* ... */
}
int main()
{
int arr[0];
someFun(arr);
}
运行此代码会导致调用void someFun(T (&)[0])
函数,推断出的参数类型int (&)[0]
。您能否解释一下为什么我不能对零元素数组使用更通用的解决方案?请不要判断此代码的原因。这只是一个用于学习目的的示例。
零大小的数组绝对不是标准C++。 从 [dcl.array]:
在声明
T
D
中,D
具有以下形式
D1 [ constant-expressionopt ] attribute-specifier-seqopt
[...]
如果存在常量表达式,则它应为类型为
std::size_t
的转换常量表达式,其值应大于零。
然而,GCC提供了零长度的数组作为扩展,但由于它们是非标准的,你不能指望它们与其他语言功能一起工作,例如模板参数推导。 您可以为零长度数组显式重载函数。
#include <cstdlib>
template<typename T, std::size_t N>
void someFun(T (&)[N]) {}
template<typename T>
void someFun(T (&)[0]) {}
int main() {
int arr[0];
someFun(arr);
}
这在 GCC (7.2.0( 上编译,但不在 Clang (6.0.0( 上编译。
相关文章:
- 第 i 个元素返回 i 的函数数组
- 使用嵌套函数数组是个好主意吗?
- 正确实现类函数数组
- 试图引用已删除函数数组的相等运算符
- 如何在静态函数中使用成员函数数组
- 无法创建函数数组
- 构造函数数组
- 使用开关或定义函数数组 - 更快
- 编写一个函数,该函数将覆盖主函数数组中的值
- 可以像'funs[1]();'一样调用的函数数组
- std::AVX内部函数数组
- 如果数组大小未知,如何将函数数组作为参数传递
- 从函数数组中获取值
- 使用元编程在编译时初始化函数数组
- 将C函数数组转换为C++函数指针数组
- 复制构造函数 [数组] C++
- 添加函数数组并随机选择其中一个
- 指针到私有成员函数数组
- 可以单独声明函数数组的元素
- (c++)将main中的随机值保存到函数数组中