最終更新日時: 2026年01月31日 13時25分25秒 (JST)
Akira Takahashi が更新

履歴 編集

function template
<iterator>

# std::data(C++17)

    namespace std {
      template <class C>
      constexpr
        auto data(C& c)
          -> decltype(c.data());       // (1) C++17
      template <class C>
      constexpr auto data(C& c)
        noexcept(noexcept(c.data()))
        -> decltype(c.data());         // (1) C++26

      template <class C>
      constexpr auto
        data(const C& c)
          -> decltype(c.data());       // (2) C++17
      template <class C>
      constexpr auto data(const C& c)
        noexcept(noexcept(c.data()))
        -> decltype(c.data());         // (2) C++26

      template <class T, std::size_t N>
      constexpr T*
        data(T (&array)[N]) noexcept;  // (3) C++17

      template <class E>
      constexpr const E*
        data(initializer_list<E> il) noexcept;  // (4) C++17、C++26で削除
    }

(4)はC++26で削除された。`std::initializer_list`に、メンバ関数版の`data()`が追加されたため、このオーバーフローは不要になった。使い方としてはこれまで通りに使用できる。

## 概要

コンテナの要素が格納されたメモリ領域へのポインタを取得する。

## 戻り値

- (1), (2) : `return c.data();`
- (3) : `return array;`
- (4) : `return il.begin();`

## 備考

- 機能テストマクロは`__cpp_lib_nonmember_container_access`で値は`201411`
- `<iterator>`ヘッダを読み込む以外では、以下のヘッダが読み込まれている場合に、この関数を使用できる：
  - `<array>`
  - `<deque>`
  - `<forward_list>`
  - `<list>`
  - `<map>`
  - `<regex>`
  - `<set>`
  - `<string>`
  - `<string_view>` (C++20)
  - `<unordered_map>`
  - `<unordered_set>`
  - `<vector>`

## 例

    #include <vector>
    #include <iostream>

    void some_c_like_api_function(const int* arr, std::size_t arr_size)
    {
      std::cout << "array size:" << arr_size << " at " << static_cast<const void*>(arr) << std::endl;
    }

    int main()
    {
      int arr[4] = {};
      some_c_like_api_function(std::data(arr), std::size(arr));
      std::vector<int> v { 12 };
      some_c_like_api_function(std::data(v), std::size(v));
    }

### 出力例

    array size:4 at 0x7fff0833f980
    array size:1 at 0x22e42b0

## バージョン

### 言語

- C++17

### 処理系

- Clang: 3.6 ✅
- GCC: 6.1 ✅
- ICC: ??
- Visual C++: 2015 ✅

## 参照

- N4280: Non-member `data()` and more (Revision 2)
- LWG Issue 3009. Including `<string_view>` doesn't provide `std::size/empty/data`
- P3016R6 Resolve inconsistencies in `begin`/`end` for `valarray` and `braced-initializer-list`