c++ std::array作为重载函数的形参是不明确的



我期望编译器根据数组的大小选择使用哪个函数。它在呼叫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]ambiguitytestmain.cpp||In function 'int main()':|
[redacted]ambiguitytestmain.cpp|19|error: call of overloaded 'funct(<brace-enclosed initializer list>)' is ambiguous|
[redacted]ambiguitytestmain.cpp|8|note: candidate: void funct(std::array<int, 2u>)|
[redacted]ambiguitytestmain.cpp|12|note: candidate: void funct(std::array<int, 3u>)|
[redacted]ambiguitytestmain.cpp|20|error: call of overloaded 'funct(<brace-enclosed initializer list>)' is ambiguous|
[redacted]ambiguitytestmain.cpp|4|note: candidate: void funct(std::array<int, 1u>)|
[redacted]ambiguitytestmain.cpp|8|note: candidate: void funct(std::array<int, 2u>)|
[redacted]ambiguitytestmain.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的带括号的初始化列表初始化。它执行聚合初始化,并将数组的其余元素初始化为0。

因此,对于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。内置数组有特殊的推导规则允许这样做。)

最新更新