home | help
std::ranges::data(3)	       C++ Standard Libary	    std::ranges::data(3)

NAME
     std::ranges::data - std::ranges::data

Synopsis
	Defined in header <ranges>
	Defined in header <iterator>
	inline namespace /* unspecified */ {

	    inline constexpr /* unspecified */ data = /*	(since C++20)
	unspecified  */;					  (customization
     point object)

	}
	Call signature
	template< class T >

	    requires /* see below */				(since C++20)
	constexpr std::remove_reference_t<

	    ranges::range_reference_t<T>>* data( T&& t );

	Returns a pointer to the first element of a contiguous range.

	If T is an array type  and  std::remove_all_extents_t<std::remove_refer-
     ence_t<T>> is
	incomplete,  then  the call to ranges::data is ill-formed, no diagnostic
     required.

	If the argument is an lvalue  or  ranges::enable_borrowed_range<std::re-
     move_cv_t<T>>
	is true, a call to ranges::data is expression-equivalent to:

	 1. decay-copy(t.data())
	    (until C++23)
	    auto(t.data())
	    (since C++23), if that expression is valid and its type is a pointer
     to an
	    object type.
	 2.  Otherwise,  std::to_address(ranges::begin(t)),  if  the  expression
     ranges::begin(t)
	    is valid and its type models std::contiguous_iterator.

	In all other cases, a call to ranges::data is ill-formed, which can  re-
     sult in
	substitution  failure when ranges::data(e) appears in the immediate con-
     text of a
	template instantiation.

Notes
	If the argument is an rvalue (i.e. T is an object type) and
	ranges::enable_borrowed_range<std::remove_cv_t<T>> is false, the call to
	ranges::data is ill-formed, which also results in substitution failure.

	If ranges::data(e) is valid for an  expression	e,  then  it  returns  a
     pointer to an
	object.

	The  C++20  standard  requires that if the underlying data function call
     returns a
	prvalue, the return value is move-constructed from the materialized tem-
     porary
	object. All implementations directly return the prvalue instead. The re-
     quirement is
	corrected by the post-C++20 proposal P0849R8 to  match	the  implementa-
     tions.

Example
     // Run this code

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

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

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

	  std::cout << a;
      }

Output:
      Hello world!

See also
	ranges::cdata obtains a pointer to the beginning of a read-only contigu-
     ous range
	(C++20)       (customization point object)
	ranges::begin returns an iterator to the beginning of a range
	(C++20)       (customization point object)
	data	      obtains the pointer to the underlying array
	(C++17)       (function template)

http://cppreference.com 	   2024.06.10		    std::ranges::data(3)

home | help