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

问题描述 投票:0回答:1

我期待编译器根据数组的大小选择使用哪个函数。在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)) ===|
c++ overloading ambiguous stdarray
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.