名稱空間
變體
操作

std::ranges::views::as_const, std::ranges::as_const_view

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
定義於標頭檔案 <ranges>
template< ranges::view V >

    requires ranges::input_range<V>
class as_const_view

    : public ranges::view_interface<as_const_view<V>>
(1) (C++23 起)
namespace views {

    inline constexpr /* unspecified */ as_const = /* unspecified */;

}
(2) (C++23 起)
呼叫簽名 (Call signature)
template< ranges::viewable_range R >

    requires /* 見下文 */

constexpr ranges::view auto as_const( R&& r );
(C++23 起)
1) 一個範圍介面卡,它表示底層 view 的檢視,該檢視也是一個 constant_rangeas_const_view 總是具有隻讀元素(如果非空)。
2) RangeAdaptorObject。令 e 為子表示式,令 Tdecltype((e)),令 Ustd::remove_cvref_t<T>。那麼表示式 views::as_const(e) 在表示式上等價於

as_const_view 總是建模 constant_range,並且當底層檢視 V 建模相應的概念時,它會建模 contiguous_rangerandom_access_rangebidirectional_rangeforward_rangeborrowed_rangecommon_rangesized_range

目錄

[編輯] 資料成員

成員 描述
V base_ (私有) 底層檢視
(僅用於闡釋的成員物件*)

[編輯] 成員函式

構造一個 as_const_view
(公開成員函式)
返回底層檢視 V
(公開成員函式)
返回 as_const_view 的起始迭代器
(公開成員函式)
返回 as_const_view 的結束迭代器
(公開成員函式)
如果檢視有界,則返回檢視的大小
(公開成員函式)
繼承自 std::ranges::view_interface
若派生檢視滿足 sized_rangeforward_range,則返回其是否為空
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
(C++23)
返回範圍開頭的常量迭代器
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
(C++23)
返回範圍常量迭代器的哨兵
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視是否非空,僅當 ranges::empty 適用於它時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
獲取派生檢視資料地址,僅當其迭代器型別滿足 contiguous_iterator 時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視中的第一個元素,如果它滿足 forward_range 則提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視的最後一個元素,僅當其滿足 bidirectional_rangecommon_range 時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]
返回派生檢視中的第 n 個元素,僅當它滿足 random_access_range 時提供
(std::ranges::view_interface<D> 的公共成員函式) [編輯]

std::ranges::as_const_view::as_const_view

as_const_view() requires std::default_initializable<V> = default;
(1) (C++23 起)
constexpr explicit as_const_view( V base );
(2) (C++23 起)
1) 透過其預設成員初始化器值初始化 base_ (= V())。
2)std::move(base) 初始化 base_

引數

base - 一個檢視

std::ranges::as_const_view::base

constexpr V base() const& requires std::copy_constructible<V>;
(1) (C++23 起)
constexpr V base() &&;
(2) (C++23 起)

返回底層檢視。

1) 從底層檢視複製構造結果。等價於 return base_;
2) 從底層檢視移動構造結果。等價於 return std::move(base_);

std::ranges::as_const_view::begin

constexpr auto begin() requires (!__simple_view<V>);
(1) (C++23 起)
constexpr auto begin() const requires ranges::range<const V>;
(2) (C++23 起)

返回檢視的常量迭代器。

1,2) 等價於 return ranges::cbegin(base_);

std::ranges::as_const_view::end

constexpr auto end() requires (!__simple_view<V>);
(1) (C++23 起)
constexpr auto end() const requires ranges::range<const V>;
(2) (C++23 起)

返回檢視的常量哨兵。

1,2) 等價於 return ranges::cend(base_);

std::ranges::as_const_view::size

constexpr auto size() requires ranges::sized_range<V>;
(1) (C++23 起)
constexpr auto size() const requires ranges::sized_range<const V>;
(2) (C++23 起)

如果檢視有界,則返回檢視的大小。

1,2) 等價於 return ranges::size(base_);

[編輯] 推導指南

template< class R >
as_const_view( R&& ) -> as_const_view<views::all_t<R>>;
(C++23 起)

[編輯] 輔助模板

template< class T >

constexpr bool enable_borrowed_range<std::ranges::as_const_view<T>> =

    ranges::enable_borrowed_range<T>;
(C++23 起)

std::ranges::enable_borrowed_range 的特化使得 as_const_view 在底層檢視滿足時,也滿足 borrowed_range

[編輯] 註解

特性測試 標準 特性
__cpp_lib_ranges_as_const 202207L (C++23) ranges::as_const_view, std::const_iterator

[編輯] 示例

#include <cassert>
#include <ranges>
 
int main()
{
    int x[]{1, 2, 3, 4, 5};
 
    auto v1 = x | std::views::drop(2);
    assert(v1.back() == 5);
    v1[0]++; // OK, can modify non-const element
 
    auto v2 = x | std::views::drop(2) | std::views::as_const;
    assert(v2.back() == 5);
    // v2[0]++; // Compile-time error, cannot modify read-only element
}

[編輯] 參閱

序列的 view,將每個元素轉換為右值
(類模板) (範圍介面卡物件)[編輯]
返回只讀範圍的起始迭代器
(自定義點物件)[編輯]
返回一個表示只讀範圍末尾的哨兵
(自定義點物件)[編輯]
(C++17)
獲取其引數的 const 引用
(函式模板) [編輯]
將迭代器轉換為常量迭代器的介面卡
(類模板) [編輯]