【问题标题】:How can std::vector be converted to std::span?如何将 std::vector 转换为 std::span?
【发布时间】:2021-03-02 03:57:17
【问题描述】:

std::span constructors 上的文档中,没有一个接受 std::vector 的文档。

那么,这段代码(source page)是怎么编译的呢?

// createSpan.cpp

#include <algorithm>
#include <iostream>
#include <span>
#include <vector>

int main() {

    std::cout << std::endl;
    std::cout << std::boolalpha;

    std::vector myVec{1, 2, 3, 4, 5};
    
    std::span mySpan1{myVec};                                        // (1)
    std::span mySpan2{myVec.data(), myVec.size()};                   // (2)
    
    bool spansEqual = std::equal(mySpan1.begin(), mySpan1.end(),
                                 mySpan2.begin(), mySpan2.end());
    
    std::cout << "mySpan1 == mySpan2: " << spansEqual << std::endl;  // (3)

    std::cout << std::endl;
    
}

即在 (1) 处调用了 std::span 的哪个构造函数?

【问题讨论】:

    标签: c++ c++20


    【解决方案1】:

    就是重载集中的构造函数(7):

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

    从解释:

    构造一个跨度,它是范围 r 上的视图;生成的跨度有size() == std::ranges::size(r)data() == std::ranges::data(r)

    此签名何时参与重载解析还有进一步的限制,但这就是本质。而std::vector 满足这些要求。

    这是一件好事,它只在必要时受到限制,因为它允许自定义(非std)容器允许隐式转换为std::span 实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-31
      • 2016-12-06
      • 2018-05-25
      • 2020-12-07
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 2020-12-09
      相关资源
      最近更新 更多