std::ranges::data
定義於標頭檔案 <ranges> |
||
定義於標頭檔案 <iterator> |
||
inline namespace /* 未指定 */ { inline constexpr /* 未指定 */ data = /* 未指定 */; |
(C++20 起) (定製點物件) |
|
呼叫簽名 (Call signature) |
||
template< class T > requires /* 見下文 */ |
(C++20 起) | |
返回一個指向連續範圍的首元素的指標。
如果 T
是陣列型別且 std::remove_all_extents_t<std::remove_reference_t<T>> 不完整,則對 ranges::data
的呼叫是非良構的,無需診斷。
如果引數是左值或 ranges::enable_borrowed_range<std::remove_cv_t<T>> 為 true,則對 ranges::data
的呼叫在表示式等價性上與
- decay-copy(t.data())(C++23 前)auto(t.data())(C++23 起) 等價,如果該表示式有效且其型別是指向物件型別的指標。
- 否則,為 std::to_address(ranges::begin(t)),如果表示式 ranges::begin(t) 有效且其型別符合 std::contiguous_iterator 模型。
在所有其他情況下,對 ranges::data
的呼叫是非良構的,這可能導致當 ranges::data(e) 出現在模板例項化的直接語境中時發生替換失敗。
目錄 |
自定義點物件
名稱 ranges::data
表示一個定製點物件,它是一個 字面量 semiregular
類型別的 const 函式物件。為了說明目的,其型別中 cv-unqualified 版本表示為 __data_fn
。
__data_fn
的所有例項均相等。在相同引數上呼叫不同型別為 __data_fn
的例項的效果是等價的,無論表示該例項的表示式是左值還是右值,以及是否為 const 限定(然而,不要求 volatile 限定的例項可呼叫)。因此,ranges::data
可以自由複製,並且其副本可以互換使用。
給定一組型別 Args...
,如果 std::declval<Args>()... 滿足上述 ranges::data
的引數要求,則 __data_fn
模型
- std::invocable<__data_fn, Args...>,
- std::invocable<const __data_fn, Args...>,
- std::invocable<__data_fn&, Args...>,以及
- std::invocable<const __data_fn&, Args...>.
否則,__data_fn
的任何函式呼叫運算子都不參與過載決議。
[編輯] 注意
如果引數是右值(即 T
是物件型別)且 ranges::enable_borrowed_range<std::remove_cv_t<T>> 為 false,則對 ranges::data
的呼叫是非良構的,這也會導致替換失敗。
如果 ranges::data(e) 對錶達式 e 有效,則它返回一個指向物件的指標。
C++20 標準要求,如果底層 data
函式呼叫返回一個純右值 (prvalue),則返回值是從具象化臨時物件移動構造的。所有實現都直接返回純右值。後 C++20 提案 P0849R8 糾正了此要求以與實現匹配。
[編輯] 示例
#include <cstring> #include <iostream> #include <ranges> #include <string> int main() { std::string s{"Hello world!\n"}; char a[20]; // storage for a C-style string std::strcpy(a, std::ranges::data(s)); // [data(s), data(s) + size(s)] is guaranteed to be an NTBS std::cout << a; }
輸出
Hello world!
[編輯] 參閱
(C++20) |
獲取指向只讀連續範圍開頭的指標 (定製點物件) |
(C++20) |
返回指向範圍開頭的迭代器 (定製點物件) |
(C++17) |
獲取指向底層陣列的指標 (函式模板) |