为什么我不能将C风格的数组复制到std :: array?

时间:2018-05-23 13:28:29

标签: c++ arrays c++11 stl stdarray

我有这段代码:

 std::array<int,16> copyarray(int input[16])
{
    std::array<int, 16> result;
    std::copy(std::begin(input), std::end(input), std::begin(result));
    return result;
}

当我尝试编译此代码时,我收到此错误:

'std::begin': no matching overloaded function found 

以及std::end的类似错误。

问题是什么以及如何解决?

3 个答案:

答案 0 :(得分:40)

在参数声明中,int input[16]int* input相同。当你传递参数数组decay to pointer时,两者都意味着有关数组大小的信息会丢失。而std::beginstd::end无法使用指针。

您可以将其更改为pass-by-reference,它会保留数组的大小。

std::array<int,16> copyarray(int (&input)[16])

请注意,您现在只能将具有精确大小16的数组传递给函数。

答案 1 :(得分:34)

已经重要的said,你可以让这个功能更灵活一点:

template <typename T, size_t N>
std::array<T, N> copyarray(T const (&input)[N])
{
    std::array<T, N> result;
    std::copy(std::begin(input), std::end(input), std::begin(result));
    return result;
}

答案 2 :(得分:1)

如上所述,问题在于数组在传递给函数时会衰减为指针,这意味着不会保留大小。

如果您知道数组中有16个元素,您可以这样做:

array<int,16> copyarray(const int input[]) {
    array<int, 16> result;
    copy_n(input, size(result), begin(result));
    return result;
}