簡體   English   中英

如何將 std::vector 轉換為 std::span?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM