我期待编译器根据数组的大小选择使用哪个函数。在call上正常工作
funct({1,2,3});
,但是其他的就模棱两可,为什么? array<int,1>
不是与 array<int,2>
、array<int,3>
等不同的数据类型吗?
这是我的代码:
#include<iostream>
#include<array>
using namespace std;
void funct(array<int,1>one)
{
cout<<"one"<<endl;
}
void funct(array<int,2>two)
{
cout<<"two"<<endl;
}
void funct(array<int,3>three)
{
cout<<"three"<<endl;
}
int main()
{
funct({1,2,3});
funct({1,2});
funct({1});
return(0);
}
这是我的构建消息(
[redacted]
是我出于明显原因删除的消息):
||=== Build: Debug in ambiguitytest (compiler: GNU GCC Compiler) ===|
[redacted]\ambiguitytest\main.cpp||In function 'int main()':|
[redacted]\ambiguitytest\main.cpp|19|error: call of overloaded 'funct(<brace-enclosed initializer list>)' is ambiguous|
[redacted]\ambiguitytest\main.cpp|8|note: candidate: void funct(std::array<int, 2u>)|
[redacted]\ambiguitytest\main.cpp|12|note: candidate: void funct(std::array<int, 3u>)|
[redacted]\ambiguitytest\main.cpp|20|error: call of overloaded 'funct(<brace-enclosed initializer list>)' is ambiguous|
[redacted]\ambiguitytest\main.cpp|4|note: candidate: void funct(std::array<int, 1u>)|
[redacted]\ambiguitytest\main.cpp|8|note: candidate: void funct(std::array<int, 2u>)|
[redacted]\ambiguitytest\main.cpp|12|note: candidate: void funct(std::array<int, 3u>)|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
std::array<int, N>
可以用任意长度的花括号初始化器列表初始化,最大为 N
。它执行聚合初始化并将数组的其余元素初始化为零。
所以对于
funct({1,2});
和 funct({1});
多个过载候选是可行的。
在重载决议中,没有规则使具有更多匹配元素的聚合初始化更好地匹配,因此重载决议是模棱两可的。
如果需要确定初始化列表的长度,可以使用模板代替:
template<std::size_t N>
void funct(const int (&arr)[N])
{
if(N == 1)
cout<<"one"<<endl;
else if(N == 2)
cout<<"two"<<endl;
else if(N == 3)
cout<<"one"<<endl;
else
cout<<"something else"<<endl;
}
(请注意,这仅适用于将内置数组作为函数参数的引用。它不适用于
std::array
。内置数组具有允许这样做的特殊推导规则。)