如何将 std::vector 转换为 std::span?

Lee*_*hai 13 c++ c++20

std::span 构造函数的文档中,没有一个接受 std::vector 。

那么,这段代码(源页面)是如何编译的?

// 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;
    
}
Run Code Online (Sandbox Code Playgroud)

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

lub*_*bgr 13

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

template< class R >
explicit(extent != std::dynamic_extent)
constexpr span( R&& r );
Run Code Online (Sandbox Code Playgroud)

从解释:

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

关于此签名何时参与重载决议还有进一步的限制,但这就是本质。并且std::vector满足这些要求。

仅在必要时才保持这种约束是一件好事,因为它允许自定义(非std)容器允许隐式转换为std::span实例。