◐ Shell
clean mode source ↗

std::data — cppreference.com

Материал из cppreference.com

<tbody> </tbody>

Определено в заголовочном файле <array>

Определено в заголовочном файле <deque>

Определено в заголовочном файле <forward_list>

Определено в заголовочном файле <iterator>

Определено в заголовочном файле <list>

Определено в заголовочном файле <map>

Определено в заголовочном файле <regex>

Определено в заголовочном файле <set>

Определено в заголовочном файле <span>

(начиная с C++20)

Определено в заголовочном файле <string>

Определено в заголовочном файле <string_view>

Определено в заголовочном файле <unordered_map>

Определено в заголовочном файле <unordered_set>

Определено в заголовочном файле <vector>

template <class C> constexpr auto data(C& c) -> decltype(c.data());

(1) (начиная с C++17)

template <class C> constexpr auto data(const C& c) -> decltype(c.data());

(2) (начиная с C++17)

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

(3) (начиная с C++17)

template <class E> constexpr const E* data(std::initializer_list<E> il) noexcept;

(4) (начиная с C++17)

Возвращает указатель на блок памяти, содержащий элементы диапазона.

1,2) возвращает c.data()

3) возвращает array

4) возвращает il.begin()

Параметры

c контейнер или представление с функцией-элементом data()
array массив произвольного типа
il список инициализаторов

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

Указатель на блок памяти, содержащий элементы диапазона.

Исключения

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 <string>
#include <cstring>
#include <iostream>

int main()
{
    std::string s {"Привет мир!\n"};

    char a[20]; // хранилище для строки в стиле C
    std::strcpy(a, std::data(s));
    // [s.data(), s.data() + s.size()] гарантированно будет NTBS, начиная с C++11

    std::cout << a;
}

Вывод:

Смотрите также

получает указатель на начало непрерывного диапазона
(объект точки настройки) [править]
получает указатель на начало непрерывного диапазона, доступного только для чтения
(объект точки настройки) [править]