std::ranges::cdata
定義於標頭檔案 <ranges> |
||
定義於標頭檔案 <iterator> |
||
inline namespace /*unspecified*/ { inline constexpr /*unspecified*/ cdata = /*unspecified*/; |
(C++20 起) (定製點物件) |
|
呼叫簽名 (Call signature) |
||
template< class T > requires /* 見下文 */ |
(C++20 起) | |
返回由常量型別(C++23 起)的引數所表示的連續範圍的第一個元素的指標。
令
對 返回型別等價於 std::remove_reference_t<ranges::range_reference_t<CT>>*。 |
(直至 C++23) |
如果引數是一個左值,或者 ranges::enable_borrowed_range<std::remove_cv_t<T>> 為 true,那麼對 表示式等價。返回型別等價於 std::remove_reference_t<ranges::range_const_reference_t<T>>*。 在所有其他情況下,對 |
(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
建模
- std::invocable<__cdata_fn, Args...>,
- std::invocable<const __cdata_fn, Args...>,
- std::invocable<__cdata_fn&, Args...>,以及
- std::invocable<const __cdata_fn&, Args...>.
否則,__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++20) |
獲取指向連續範圍開頭的指標 (自定義點物件) |
(C++17) |
獲取指向底層陣列的指標 (函式模板) |