Namespaces
Variants

std::data

ja.cppreference.net から
 
 
イテレータライブラリ
イテレータ概念
イテレータプリミティブ
アルゴリズムの概念とユーティリティ
間接呼び出し可能概念
共通アルゴリズム要件
(C++20)
(C++20)
(C++20)
ユーティリティ
(C++20)
イテレータアダプタ
範囲アクセス
(C++11)(C++14)
(C++14)(C++14)  
(C++11)(C++14)
(C++14)(C++14)  
(C++17)(C++20)
(C++17)
(C++17)
 
ヘッダで定義 <array>
ヘッダで定義 <deque>
ヘッダで定義 <flat_map>
 (C++23 から)
ヘッダで定義 <flat_set>
 (C++23 から)
ヘッダで定義 <forward_list>
ヘッダで定義 <inplace_vector>
 (C++26 から)
ヘッダで定義 <iterator>
ヘッダで定義 <list>
ヘッダで定義 <map>
ヘッダで定義 <optional>
 (C++26 から)
ヘッダで定義 <regex>
ヘッダで定義 <set>
ヘッダで定義 <span>
 (C++20 から)
ヘッダで定義 <stacktrace>
 (C++23 から)
ヘッダで定義 <string>
ヘッダで定義 <string_view>
ヘッダで定義 <unordered_map>
ヘッダで定義 <unordered_set>
ヘッダで定義 <valarray>
ヘッダで定義 <vector>
template< class C >
constexpr auto data( C& c ) noexcept(noexcept(c.data()))
    -> decltype(c.data());
(1) (C++17 から)
template< class C >
constexpr auto data( const C& c ) noexcept(noexcept(c.data()))
    -> decltype(c.data());
(2) (C++17 から)
template< class T, std::size_t N >
constexpr T* data( T (&array)[N] ) noexcept;
(3) (C++17 から)

範囲の要素を含むメモリブロックへのポインタを返します。

1,2) 返す c.data().
3) 返す array.

パラメータ

c - データメンバ関数を持つコンテナまたはビュー data ( )
array - 任意の型の配列
il - std::initializer_list

戻り値

1,2) c. data ( )
3) array
4) il. begin ( )

例外

1) 実装定義の例外をスローする可能性があります。

注記

std::initializer_list のオーバーロードが必要な理由は、これがメンバー関数 data を持たないためです。

機能テスト マクロ 値 標準 機能
__cpp_lib_nonmember_container_access 201411L (C++17) std::size() , std::data() , および std::empty()

実装例

第一バージョン
template<class C>
constexpr auto data(C& c) -> decltype(c.data())
{
    return c.data();
}
第二バージョン
template<class C>
constexpr auto data(const C& c) -> decltype(c.data())
{
    return c.data();
}
第三バージョン
template<class T, std::size_t N>
constexpr T* data(T (&array)[N]) noexcept
{
    return array;
}
第四バージョン
template<class E>
constexpr const E* data(std::initializer_list<E> il) noexcept
{
    return il.begin();
}

例

#include <cstring>
#include <iostream>
#include <string>
int main()
{
    std::string s{"Hello world!\n"};
    char a[20]; // Cスタイル文字列用のストレージ
    std::strcpy(a, std::data(s));
//  [s.data(), s.data() + s.size()] は C++11 以降 NTBS であることが保証されています
    std::cout << a;
}

出力:

Hello world!

欠陥報告

以下の動作を変更する欠陥報告は、以前に公開されたC++標準に遡及的に適用されました。

DR 適用先 公開時の動作 正しい動作
P3016R6 C++17 1) 非メンバ std::data オーバーロードは std::initializer_list
に対して提供されていた2) std::data は例外仕様を伝播する必要はなかった
1) 削除
2) 必須

関連項目

連続範囲の先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト)
読み取り専用連続範囲の先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト)