![](/img/trans.png)
[英]How to convert a std::vector of unique pointers to a std::span of raw pointers?
[英]How can std::vector be converted to std::span?
在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 的哪個構造函數?
它是重載集中的構造函數 (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
實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.