在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;
    
}
即在 (1) 处调用了 std::span 的哪个构造函数?
lub*_*bgr 13
它是重载集中的构造函数 (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实例。
| 归档时间: | 
 | 
| 查看次数: | 1187 次 | 
| 最近记录: |