std::data
С ru.cppreference.net
| Определено в заголовке <array>
|
||
| Определено в заголовке <deque>
|
||
| Определено в заголовке <flat_map>
|
(since C++23) |
|
| Определено в заголовке <flat_set>
|
(since C++23) |
|
| Определено в заголовке <forward_list>
|
||
| Определено в заголовке <inplace_vector>
|
(since C++26) |
|
| Определено в заголовке <iterator>
|
||
| Определено в заголовке <list>
|
||
| Определено в заголовке <map>
|
||
| Определено в заголовке <optional>
|
(since C++26) |
|
| Определено в заголовке <regex>
|
||
| Определено в заголовке <set>
|
||
| Определено в заголовке <span>
|
(since C++20) |
|
| Определено в заголовке <stacktrace>
|
(since 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) | (since C++17) |
template< class C >
constexpr auto data( const C& c ) noexcept(noexcept(c.data()))
-> decltype(c.data());
|
(2) | (since C++17) |
template< class T, std::size_t N >
constexpr T* data( T (&array)[N] ) noexcept;
|
(3) | (since 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]; // 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::data перегрузка была предоставлена для std::initializer_list2) std::data не требовалось для распространения спецификации исключений
|
1) удалено 2) требуется |
Смотрите также
|
(C++20)
|
получает указатель на начало непрерывного диапазона
(объект точки кастомизации) |
|
(C++20)
|
получает указатель на начало диапазона только для чтения с непрерывным расположением
(объект точки кастомизации) |