 st8b7c:f320:99b9:690f:4595:cd17:293a:c069data    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, st8b7c:f320:99b9:690f:4595:cd17:293a:c069size_t N> 
constexpr T* data(T (&array)[N]) noexcept;
  (3)   (since C++17)     template <class E>
constexpr const E* data(st8b7c:f320:99b9:690f:4595:cd17:293a:c069initializer_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 st8b7c:f320:99b9:690f:4595:cd17:293a:c069initializer_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, st8b7c:f320:99b9:690f:4595:cd17:293a:c069size_t N>
constexpr T* data(T (&array)[N]) noexcept
{
    return array;
} 
   Fourth version 
   template <class E> 
constexpr const E* data(st8b7c:f320:99b9:690f:4595:cd17:293a:c069initializer_list<E> il) noexcept
{
    return il.begin();
} 

  Example  #include <string>
#include <cstring>
#include <iostream>
 
int main()
{
    st8b7c:f320:99b9:690f:4595:cd17:293a:c069string s {"Hello world!\n"};
 
    char a[20]; // storage for a C-style string
    st8b7c:f320:99b9:690f:4595:cd17:293a:c069strcpy(a, st8b7c:f320:99b9:690f:4595:cd17:293a:c069data(s));
    // [s.data(), s.data() + s.size()] is guaranteed to be an NTBS since C++11
 
    st8b7c:f320:99b9:690f:4595:cd17:293a:c069cout << a;
} Output:
Hello world!   See also     ranges8b7c:f320:99b9:690f:4595:cd17:293a:c069ta
(C++20)   obtains a pointer to the beginning of a contiguous range  (customization point object) 
    ranges8b7c:f320:99b9:690f:4595:cd17:293a:c069ta
(C++20)   obtains a pointer to the beginning of a read-only contiguous range  (customization point object) 
  

    
{'path': 'public/docs/cpp/iterator/data.html', 'source': 'DevDocs.IO'}