名稱空間
變體
操作

std::ranges::cdata

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

    inline constexpr /*unspecified*/ cdata = /*unspecified*/;

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

    requires /* 見下文 */

constexpr /* see below */ cdata( T&& t );
(C++20 起)

返回由常量型別(C++23 起)的引數所表示的連續範圍的第一個元素的指標。

CT

ranges::cdata 的呼叫與 ranges::data(static_cast<CT&&>(t)) 表示式等價

返回型別等價於 std::remove_reference_t<ranges::range_reference_t<CT>>*

(直至 C++23)

如果引數是一個左值,或者 ranges::enable_borrowed_range<std::remove_cv_t<T>>true,那麼對 ranges::cdata 的呼叫與

表示式等價。返回型別等價於 std::remove_reference_t<ranges::range_const_reference_t<T>>*

在所有其他情況下,對 ranges::cdata 的呼叫是 ill-formed(病式),當該調用出現在模板例項化的即時語境中時,這可能導致替換失敗

(C++23 起)

如果 ranges::cdata(t) 是有效的,那麼它返回一個指向常量型別(C++23 起)物件的指標。

自定義點物件

名稱 ranges::cdata 表示一個自定義點物件,它是一個 const 函式物件,其型別是一個字面量 semiregular 類型別。為便於說明,其型別中的 cv 不合格版本表示為 __cdata_fn

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

給定一組型別 Args...,如果 std::declval<Args>()... 滿足上面 ranges::cdata 的引數要求,則 __cdata_fn 建模

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

[編輯] 示例

#include <cstring>
#include <iostream>
#include <ranges>
#include <string>
 
int main()
{
    std::string src {"hello world!\n"};
 
//  std::ranges::cdata(src)[0] = 'H'; // error, src.data() is treated as read-only
    std::ranges::data(src)[0] = 'H'; // OK, src.data() is a non-const storage
 
    char dst[20]; // storage for a C-style string
    std::strcpy(dst, std::ranges::cdata(src));
    // [data(src), data(src) + size(src)] is guaranteed to be an NTBS
 
    std::cout << dst;
}

輸出

Hello world!

[編輯] 參閱

獲取指向連續範圍開頭的指標
(自定義點物件)[編輯]
(C++17)
獲取指向底層陣列的指標
(函式模板) [編輯]