名稱空間
變體
操作

std::ranges::data

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

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

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

    requires /* 見下文 */
constexpr std::remove_reference_t<

    ranges::range_reference_t<T>>* data( T&& t );
(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 的呼叫在表示式等價性上與

  1. decay-copy(t.data())(C++23 前)auto(t.data())(C++23 起) 等價,如果該表示式有效且其型別是指向物件型別的指標。
  2. 否則,為 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 模型

否則,__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++17)
獲取指向底層陣列的指標
(函式模板) [編輯]