Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

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>
	  inline namespace /*unspecified*/ {
										(since
       C++20)
	  inline    constexpr	 /*unspecified*/   data	  =   /*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	the    argument	   is	an   lvalue   or   ranges::enable_bor-
       rowed_range<std::remove_cv_t<T>>
	  is true, a call to ranges::data is expression-equivalent to:

	   1. std::forward<T>(t).data()	converted to its decayed type, if that
       converted
	      expression is valid, and its return type is a pointer to an  ob-
       ject type.
	   2.  Otherwise,  std::to_address(ranges::begin(std::forward<T>(t))),
       if
	      ranges::begin(std::forward<T>(t))	is valid and  returns  a  type
       that models
	      std::contiguous_iterator.

			   If	  std::remove_all_extents_t<std::remove_refer-
       ence_t<T>> is
			   incomplete,	then  ranges::data(std::forward<T>(t))
       is ill-formed, no
			   diagnostic required.

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

	 Expression-equivalent

	  Expression e is expression-equivalent	to expression f, if

	    * e	and f have the same effects, and
	    *  either  both  are  constant subexpressions or else neither is a
       constant
	      subexpression, and
	    * either both are potentially-throwing or else neither  is	poten-
       tially-throwing
	      (i.e. noexcept(e)	== noexcept(f)).

	 Customization point objects

	  The name ranges::data	denotes	a customization	point object, which is
       a const
	  function  object of a	literal	semiregular class type.	For exposition
       purposes, the
	  cv-unqualified version of its	type is	denoted	as __data_fn.

	  All instances	of __data_fn are equal.	The effects of	invoking  dif-
       ferent instances	of
	  type	__data_fn  on the same arguments are equivalent, regardless of
       whether the
	  expression denoting the instance is an  lvalue  or  rvalue,  and  is
       const-qualified or
	  not  (however,  a  volatile-qualified	instance is not	required to be
       invocable). Thus,
	  ranges::data can be copied freely and	its copies can be used	inter-
       changeably.

	  Given	 a  set	 of types Args..., if std::declval<Args>()... meet the
       requirements for
	  arguments to ranges::data above, __data_fn models

	    * std::invocable<__data_fn,	Args...>,
	    * std::invocable<const __data_fn, Args...>,
	    * std::invocable<__data_fn&, Args...>, and
	    * std::invocable<const __data_fn&, Args...>.

	  Otherwise, no	function call operator of  __data_fn  participates  in
       overload
	  resolution.

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 fail-
       ure.

	  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
       temporary
	  object. All implementations directly return the prvalue instead. The
       requirement is
	  corrected  by	the post-C++20 proposal	P0849R8	to match the implemen-
       tations.

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 con-
       tiguous 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		  2022.07.31		  std::ranges::data(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::ranges::data&sektion=3&manpath=FreeBSD+Ports+15.0>

home | help