名稱空間
變體
操作

std::ranges::ssize

來自 cppreference.com
< cpp‎ | ranges
 
 
範圍庫 (Ranges library)
範圍介面卡 (Range adaptors)
 
定義於標頭檔案 <ranges>
定義於標頭檔案 <iterator>
inline namespace /* 未指定 */ {

    inline constexpr /* 未指定 */ ssize = /* 未指定 */;

}
(C++20 起)
(定製點物件)
呼叫簽名 (Call signature)
template< class T >

    requires /* 見下文 */

constexpr auto ssize( T&& t );
(C++20 起)

以常數時間計算 t 中的元素數量,並將結果轉換為有符號型別。

給定 t 表示(可能已具象化的)結果物件的子表示式E

目錄

自定義點物件

名稱 ranges::ssize 指代一個*定製點物件*,它是一個 const 函式物件,型別為 字面量 semiregular 類。為了便於說明,其型別的不帶 cv 限定符的版本表示為 __ssize_fn

__ssize_fn 的所有例項均相等。對同一引數呼叫型別 __ssize_fn 的不同例項的效果是等價的,無論表示例項的表示式是左值還是右值,以及是否帶有 const 限定符(但是,帶有 volatile 限定符的例項不要求可呼叫)。因此,ranges::ssize 可以自由複製,並且其副本可以互換使用。

給定一組型別 Args...,若 std::declval<Args>()... 滿足上述 ranges::ssize 引數的要求,則 __ssize_fn 模擬

否則,__ssize_fn 的任何函式呼叫運算子都不參與過載決議。

[編輯] 注意

如果對於表示式 eranges::ssize(e) 有效,則返回型別為有符號整數類型。

[編輯] 示例

#include <array>
#include <iostream>
#include <ranges>
#include <type_traits>
 
int main()
{
    std::array arr{1, 2, 3, 4, 5};
    auto s = std::ranges::ssize(arr);
 
    std::cout << "ranges::ssize(arr) = " << s << '\n'
              << "ranges::ssize is "
              << (std::is_signed_v<decltype(s)> ? "signed" : "unsigned")
              << '\n';
 
    std::cout << "reversed arr: ";
 
    for (--s; s >= 0; --s)
        std::cout << arr[s] << ' ';
 
    std::cout << "\n" "s = " << s << '\n';
}

輸出

ranges::ssize(arr) = 5
ranges::ssize is signed
reversed arr: 5 4 3 2 1
s = -1

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 3403 C++20 ranges::size 對某些非 range 型別有效,但 ranges::ssize 無效 已修復

[編輯] 另請參閱

返回等於範圍大小的整數
(定製點物件)[編輯]
指定範圍在常數時間內知道其大小
(概念) [編輯]
返回迭代器與哨兵之間,或範圍開頭與結尾之間的距離
(演算法函式物件)[編輯]
(C++17)(C++20)
返回容器或陣列的大小
(函式模板) [編輯]