std::ranges::views::single, std::ranges::single_view - cppreference.com

From cppreference.com

Defined in header

<ranges>

template<std::copy_constructibleT>requiresstd::is_object_v<T>classsingle_view:publicranges::view_interface<single_view<T>> (1)(since C++20)
(until C++23)template<std::move_constructibleT>requiresstd::is_object_v<T>classsingle_view:publicranges::view_interface<single_view<T>>(since C++23)namespaceviews{inlineconstexpr/* unspecified */single=/* unspecified */;} (2) (since C++20)Call signature

template<classT>requires/* see below */constexpr/* see below */single(T&&t);(since C++20)1) Produces a

view

that contains exactly one element of a specified value.

2) The expression views::single(e) is

expression-equivalent

to single_view<std::decay_t<decltype((e))>>(e) for any suitable subexpression e.

The lifetime of the element is bound to the parent single_view. Copying single_view makes a copy of the element.

Customization point objects

The name views::single denotes a customization point object, which is a const

function object

of a

literal

semiregular

class type. See

CustomizationPointObject

for details.

Data members

Member Description value_the single element of the view
(exposition-only member object*)Member functions

(constructor)

constructs a single_view
(public member function)

begin

returns a pointer to the element
(public member function)

end

returns a pointer past the element
(public member function)

empty

[static]

returns false
(public static member function)

size

[static]

returns 1
(public static member function)

data

returns a pointer to the element
(public member function) Inherited from

std::ranges::view_interface

cbegin

(C++23)

returns a constant iterator to the beginning of the range
(public member function of std::ranges::view_interface<D>)

[edit]

cend

(C++23)

returns a sentinel for the constant iterator of the range
(public member function of std::ranges::view_interface<D>)

[edit]

operator bool

returns whether the derived view is not empty, provided only if

ranges::empty

is applicable to it
(public member function of std::ranges::view_interface<D>)

[edit]

front

returns the first element in the derived view, provided if it satisfies

forward_range

(public member function of std::ranges::view_interface<D>)

[edit]

back

returns the last element in the derived view, provided only if it satisfies

bidirectional_range

and

common_range

(public member function of std::ranges::view_interface<D>)

[edit]

operator[]

returns the nth element in the derived view, provided only if it satisfies

random_access_range

(public member function of std::ranges::view_interface<D>)

[edit]

std::ranges::single_view::single_view

single_view()requiresstd::default_initializable<T>=default; (1) (since C++20)constexprexplicitsingle_view(constT&t); (2)(since C++20)
(until C++23)constexprexplicitsingle_view(constT&t)requiresstd::copy_constructible<T>;(since C++23)constexprexplicitsingle_view(T&&t); (3) (since C++20)template<class...Args>requiresstd::constructible_from<T,Args...>constexprexplicitsingle_view(std::in_place_t,Args&&...args); (4) (since C++20)Constructs a single_view.

1) Default initializes value_, which value-initializes its contained value.

2) Initializes value_ with t.

3) Initializes value_ with std::move(t).

4) Initializes value_ as if by value_{std::in_place,std::forward<Args>(args)...}.

std::ranges::single_view::begin

constexprT*begin()noexcept;constexprconstT*begin()constnoexcept;(since C++20)Equivalent to returndata();.

std::ranges::single_view::end

constexprT*end()noexcept;constexprconstT*end()constnoexcept;(since C++20)Equivalent to returndata()+1;.

std::ranges::single_view::empty

staticconstexprboolempty()noexcept;(since C++20)Equivalent to returnfalse;.

std::ranges::single_view::size

staticconstexprstd::size_tsize()noexcept;(since C++20)Equivalent to return1;.

Makes single_view model /*tiny-range*/ as required by

split_view

.

std::ranges::single_view::data

constexprT*data()noexcept;constexprconstT*data()constnoexcept;(since C++20)Returns a pointer to the contained value of value_. The behavior is undefined if value_ does not contains a value.

Deduction guides

template<classT>single_view(T)->single_view<T>;(since C++20)Notes

For a

single_view

, the inherited empty member function always returns false, and the inherited operatorbool conversion function always returns true.

Example

Run this code

#include<iomanip>#include<iostream>#include<ranges>#include<string>#include<tuple>intmain(){constexprstd::ranges::single_viewsv1{3.1415};// uses (const T&) constructorstatic_assert(sv1);static_assert(notsv1.empty());std::cout<<"1) *sv1.data(): "<<*sv1.data()<<'\n'<<"2) *sv1.begin(): "<<*sv1.begin()<<'\n'<<"3) sv1.size(): "<<sv1.size()<<'\n'<<"4) distance: "<<std::distance(sv1.begin(),sv1.end())<<'\n';std::stringstr{"C++20"};std::cout<<"5) str = "<<std::quoted(str)<<'\n';std::ranges::single_viewsv2{std::move(str)};// uses (T&&) constructorstd::cout<<"6) *sv2.data(): "<<std::quoted(*sv2.data())<<'\n'<<"7) str = "<<std::quoted(str)<<'\n';std::ranges::single_view<std::tuple<int,double,std::string>>sv3{std::in_place,42,3.14,"😄"};// uses (std::in_place_t, Args&&... args)std::cout<<"8) sv3 holds a tuple: { "<<std::get<0>(sv3[0])<<", "<<std::get<1>(sv3[0])<<", "<<std::get<2>(sv3[0])<<" }\n";}Output:

1) *sv1.data(): 3.1415 2) *sv1.begin(): 3.1415 3) sv1.size(): 1 4) distance: 1 5) str = "C++20" 6) *sv2.data(): "C++20" 7) str = "" 8) sv3 holds a tuple: { 42, 3.14, 😄 } Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior

LWG 3428

C++20 single_view was convertible from

std::in_place_t

the constructor is made explicit

LWG 4035

C++20 single_view did not provide the member function empty()provides empty()

P2367R0

C++20 deduction guides for single_view failed to decay the argument;
views::single copied but not wrapped a single_viewa decaying guide provided;
made always wrapping See also