C++ std::array作为重载函数的参数是二义性的

jvlzgdj9  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(121)

我期望编译器根据数组的大小选择使用哪个函数。它在调用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)) ===|
ej83mcc0

ej83mcc01#

一个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;
}

(Note这只适用于对作为函数参数的内置数组的引用。它不适用于std::array。内置数组有特殊的演绎规则允许这一点。)

相关问题