为什么 `std::swap< std::array<int,3> >` 无法编译?

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

我想交换两个固定大小的整数数组。

与直觉相反,以下内容无法编译,因为没有找到

swap
的匹配实例。

#include <array>
#include <utility>

int main()
{
    std::array<int,3> a, b;
    std::swap< std::array<int,3> >( a, b ); 
    return 0;
}

我觉得这很令人惊讶。但是,用

std::swap(a,b)
替换交换可以编译并且(根据 VSCode)具有签名

inline void std::swap<int, 3UL>(std::array<int, 3UL> &__one, std::array<int, 3UL> &__two)

我也无法理解。

问: 这是怎么回事?

c++ stl
1个回答
4
投票

您正在寻找的重载是(来自cppreference):

template< class T, std::size_t N >    
constexpr void swap( std::array<T, N>& lhs,
                     std::array<T, N>& rhs )
                         noexcept(/* see below */);

如错误报告所示,不存在与

swap
匹配的可行的
std::swap<std::array<int,3>>
重载。

这将是显式提供模板参数的“正确”方式:

#include <array>
#include <utility>

int main()
{
    std::array<int,3> a, b;
    std::swap<int,3>( a, b ); 
    return 0;
}

我怀疑在某种情况下你真的想这样做。

PS:您还可以在从 VSCOde 获得的签名中看到:

std::swap<int, 3UL>
不是
std::swap<std::array<int,3UL>>
。然而,查看实现有时可能会产生误导,我建议首先查阅文档。

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