# std::data

From cppreference.com
< cpp‎ | iterator

Defined in header `<array>` |  |
Defined in header `<deque>` |  |
Defined in header `<forward_list>` |  |
Defined in header `<iterator>` |  |
Defined in header `<list>` |  |
Defined in header `<map>` |  |
Defined in header `<regex>` |  |
Defined in header `<set>` |  |
Defined in header `<span>` |  | (since C++20)
Defined in header `<string>` |  |
Defined in header `<string_view>` |  |
Defined in header `<unordered_map>` |  |
Defined in header `<unordered_set>` |  |
Defined in header `<vector>` |  |
template <class C> constexpr auto data(C& c) -> decltype(c.data()); | (1) | (since C++17)
template <class C> constexpr auto data(const C& c) -> 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)
template <class E> constexpr const E* data(std::initializer_list<E> il) noexcept; | (4) | (since C++17)

Returns a pointer to the block of memory containing the elements of the range.

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

### Parameters

c | - | a container or view with a data() member function
array | - | an array of arbitrary type
il | - | an initializer list

### Return value

A pointer to the block of memory containing the elements of the range.

### Exceptions

1) May throw implementation-defined exceptions.

### Notes

The overload for std::initializer_list is necessary because it does not have a member function `data`.

Feature-test macro
`__cpp_lib_nonmember_container_access`

### Possible implementation

First version
    template <class C>
    constexpr auto data(C& c) -> decltype(c.data())
    {
        return c.data();
    }
Second version
    template <class C>
    constexpr auto data(const C& c) -> decltype(c.data())
    {
        return c.data();
    }
Third version
    template <class T, std::size_t N>
    constexpr T* data(T (&array)[N]) noexcept
    {
        return array;
    }
Fourth version
    template <class E>
    constexpr const E* data(std::initializer_list<E> il) noexcept
    {
        return il.begin();
    }

### Example

Run this code

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

    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;
    }

Output:

    Hello world!

### See also

ranges::data (C++20) | obtains a pointer to the beginning of a contiguous range (customization point object)
ranges::cdata (C++20) | obtains a pointer to the beginning of a read-only contiguous range (customization point object)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/iterator/data&oldid=137740"