Spec-Zone.ru › C++

std::data

Определено в заголовке <array>
Определено в заголовке <deque>
Определено в заголовке <flat_map> (начиная с C++23)
Определено в заголовке <flat_set> (начиная с C++23)
Определено в заголовке <forward_list>
Определено в заголовке <hive> (начиная с C++26)
Определено в заголовке <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 - массив произвольного типа

Возвращаемое значение

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

Исключения

1,2) Какие исключения и когда выбрасывает вызов нижележащей функции c.data().

Примечания

Макрос проверки наличия возможности Значение Стандарт Возможность
__cpp_lib_nonmember_container_access 201411L (C++17) std::size(), std::data() и std::empty()
__cpp_lib_initializer_list 202511L (C++26)
(DR11)
data и empty функции-члены std::initializer_list;
удаление ненужных свободных функций для std::initializer_list[1]
  1. По состоянию на 2026-05-27 libstdc++ не рассматривает добавление и удаление функций из P3016R6 как отчёт об ошибке для C++11 и применяет эти изменения только начиная с C++26.
    Перегрузка для std::initializer_list была необходима до P3016R6, поскольку у него не было функции-члена data.

Возможная реализация

Первая версия
template<class C>
constexpr auto data(C& c) noexcept(noexcept(c.data()))
    -> decltype(c.data())
{
    return c.data();
}
Вторая версия
template<class C>
constexpr auto data(const C& c) noexcept(noexcept(c.data()))
    -> decltype(c.data())
{
    return c.data();
}
Третья версия
template<class T, std::size_t N>
constexpr T* data(T (&array)[N]) noexcept
{
    return array;
}

Пример

#include <cstring>
#include <iostream>
#include <string>

int main()
{
    std::string s{"Hello world!\n"};

    char a[20]; // storage for a C-style string
    std::strcpy(a, std::data(s));
//  [s.data(), s.data() + s.size()] is guaranteed to be an NTBS since C++11

    std::cout << a;
}

Вывод:

Hello world!

Отчёт об ошибке

Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.

DR Применён к Поведение в опубликованной редакции Исправленное поведение
P3016R6 C++17 1) Для std::initializer_list была предусмотрена нешаблонная перегрузка std::data
2) От std::data не требовалось распространять спецификацию исключений
1) удалена
2) требуется

См. также

ranges::data
(C++20)
получает указатель на начало непрерывного диапазона
(объект-точка настройки)
ranges::cdata
(C++20)
получает указатель на начало доступного только для чтения непрерывного диапазона
(объект-точка настройки)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/iterator/data

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API