0

有没有办法将空std::span<int>传递给函数?

我有如下功能:

bool func( const std::vector<int>& indices )
{
    if ( !indices.empty( ) )
    {
        /* do something */
    }

    ...
}


// when calling it with an empty vector
const bool isAcceptable { func( std::vector<int>( 0 ) ) };

而且我想将其更改为使用std::span而不是,std::vector以便它也可以获取std::array原始数组作为其参数。

现在在这里:

bool func( const std::span<const int> indices )
{
    if ( !indices.empty( ) )
    {
        /* do something */
    }

    ...
}


// when calling it with an empty span
const bool isAcceptable { func( std::span<int>( ) ) }; // Is this valid code?

是否也std::span正确支持所有连续的容器(例如std::vectorstd::array等)?

4

1 回答 1

2

std::span的默认构造函数记录为:

constexpr span() noexcept;

构造一个空跨度,其data() == nullptrsize() == 0

因此,传递一个默认构造std::span<int>()是明确定义的。调用empty()它保证返回true


是否std::span正确支持所有连续容器(例如std::vector,std::array等)?

基本上,std::span可以从任何模拟连续和大小范围的东西构建:

template<class R>
explicit(extent != std::dynamic_extent)
constexpr span(R&& range);

构造一个跨度,它是范围范围内的视图;结果跨度有size() == std::ranges::size(range)data() == std::ranges::data(range)

特别是,std::vector确实满足这些要求。

对于 C 风格的数组,std::array有特殊的构造函数(利用它们的编译时大小):

template<std::size_t N>
constexpr span(element_type (&arr)[N]) noexcept;
template<class U, std::size_t N>
constexpr span(std::array<U, N>& arr) noexcept;
template<class U, std::size_t N>
constexpr span(const std::array<U, N>& arr) noexcept;

构造一个跨度,它是数组的视图arr;结果跨度有size() == Ndata() == std::data(arr)

于 2021-12-26T17:03:25.230 回答