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

FreeBSD Manual Pages

  
 
  

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

NAME
       std::optional::optional - std::optional::optional

Synopsis
	  constexpr optional() noexcept;		 (since
	  constexpr optional( std::nullopt_t )	     (1) C++17)
	  noexcept;
	  constexpr optional( const optional& other  (2) (since
	  );						 C++17)
	  constexpr optional( optional&& other )     (3) (since
	  noexcept(/* see below	*/);			 C++17)
								 (since	C++17)
	  template < class U >					 (until	C++20)
	  optional(  const  optional<U>& other );		   (condition-
       ally
								 explicit)
	  template < class U >					 (since	C++20)
	  constexpr optional( const  optional<U>&		   (condition-
       ally
	  other	);						 explicit)
										(since
       C++17)
	  template	       <	     class	       U	     >
       (until C++20)
	  optional(		optional<U>&&		  other		    );
       (conditionally
										ex-
       plicit)
	  template	       <	     class	       U	     >
       (since C++20)
	  constexpr	  optional(	  optional<U>&&	       other	    );
       (conditionally
										ex-
       plicit)
	  template< class... Args >		     (4)
	  constexpr	explicit    optional(				   (6)
       (since C++17)
	  std::in_place_t, Args&&... args );
	  template< class U, class... Args >		 (5)

	  constexpr explicit optional(
	  std::in_place_t,
								 (7)
       (since C++17)
	   std::initializer_list<U> ilist,

				       Args&&...
	  args );
	  template	  <	   class	U	 =	   T	     >
       (since C++17)
	  constexpr   optional(	  U&&	value	);			   (8)
       (conditionally
										ex-
       plicit)

	  Constructs a new optional object.

	  1) Constructs	an object that does not	contain	a value.
	  2) Copy constructor: If other	contains a value, initializes the con-
       tained value as
	  if direct-initializing (but not direct-list-initializing) an	object
       of type T with
	  the expression *other. If other does not contain a value, constructs
       an object that
	  does not contain a value.
	    *  This  constructor  is  defined  as deleted if std::is_copy_con-
       structible_v<T> is
	      false.
	    * It  is  a	 trivial  constructor  if  std::is_trivially_copy_con-
       structible_v<T> is
	      true.
	  3) Move constructor: If other	contains a value, initializes the con-
       tained value as
	  if  direct-initializing (but not direct-list-initializing) an	object
       of type T with
	  the expression std::move(*other) and does not	make  other  empty:  a
       moved-from
	  std::optional	 still contains	a value, but the value itself is moved
       from. If	other
	  does not contain a value, constructs an object that does not contain
       a value.
	    * This constructor does not	participate in overload	resolution un-
       less
	      std::is_move_constructible_v<T> is true.
	    * It  is  a	 trivial  constructor  if  std::is_trivially_move_con-
       structible_v<T> is
	      true.
	  4)  Converting  copy constructor: If other does not contain a	value,
       constructs an
	  optional object that does not	contain	a value. Otherwise, constructs
       an optional
	  object that contains a value,	initialized as if  direct-initializing
       (but not
	  direct-list-initializing)  an	 object	 of type T with	the expression
       *other.
	    * This constructor does not	participate in overload	resolution un-
       less the
	      following	conditions are met:
		 * std::is_constructible_v<T, const U&>	is true.
		 * If T	is not (possibly cv-qualified) bool,  T	 is  not  con-
       structible or
		   convertible	from  any  expression of type (possibly	const)
       std::optional<U>,
		   i.e., the following 8 values	are all	false:
		      *	std::is_constructible_v<T, std::optional<U>&>
		      *	std::is_constructible_v<T, const std::optional<U>&>
		      *	std::is_constructible_v<T, std::optional<U>&&>
		      *	std::is_constructible_v<T, const std::optional<U>&&>
		      *	std::is_convertible_v<std::optional<U>&, T>
		      *	std::is_convertible_v<const std::optional<U>&, T>
		      *	std::is_convertible_v<std::optional<U>&&, T>
		      *	std::is_convertible_v<const std::optional<U>&&,	T>
	    * This constructor is explicit if  and  only  if  std::is_convert-
       ible_v<const U&,	T>
	      is false.
	  5)  Converting  move constructor: If other does not contain a	value,
       constructs an
	  optional object that does not	contain	a value. Otherwise, constructs
       an optional
	  object that contains a value,	initialized as if  direct-initializing
       (but not
	  direct-list-initializing)  an	 object	 of type T with	the expression
       std::move(*other).
	    * This constructor does not	participate in overload	resolution un-
       less the
	      following	conditions are met:
		 * std::is_constructible_v<T, U&&> is true.
		 * If T	is not (possibly cv-qualified) bool,  T	 is  not  con-
       structible or
		   convertible	from  any  expression of type (possibly	const)
       std::optional<U>,
		   i.e., the following 8 values	are all	false:
		      *	std::is_constructible_v<T, std::optional<U>&>
		      *	std::is_constructible_v<T, const std::optional<U>&>
		      *	std::is_constructible_v<T, std::optional<U>&&>
		      *	std::is_constructible_v<T, const std::optional<U>&&>
		      *	std::is_convertible_v<std::optional<U>&, T>
		      *	std::is_convertible_v<const std::optional<U>&, T>
		      *	std::is_convertible_v<std::optional<U>&&, T>
		      *	std::is_convertible_v<const std::optional<U>&&,	T>
	    * This constructor is explicit if  and  only  if  std::is_convert-
       ible_v<U&&, T> is
	      false.
	  6)  Constructs an optional object that contains a value, initialized
       as if
	  direct-initializing (but not direct-list-initializing) an object  of
       type T from the
	  arguments std::forward<Args>(args)....
	    *  If  the	selected  constructor of T is a	constexpr constructor,
       this constructor	is
	      a	constexpr constructor.
	    * The function does	not participate	in the overload	resolution un-
       less
	      std::is_constructible_v<T, Args...> is true.
	  7) Constructs	an optional object that	contains a value,  initialized
       as if
	  direct-initializing  (but not	direct-list-initializing) an object of
       type T from the
	  arguments ilist, std::forward<Args>(args)....
	    * If the selected constructor of T	is  a  constexpr  constructor,
       this constructor	is
	      a	constexpr constructor.
	    * The function does	not participate	in the overload	resolution un-
       less
	      std::is_constructible_v<T,  std::initializer_list<U>&,  Args...>
       is true.
	  8) Constructs	an optional object that	contains a value,  initialized
       as if
	  direct-initializing  (but not	direct-list-initializing) an object of
       type T with the
	  expression std::forward<U>(value).
	    * If the selected constructor of T	is  a  constexpr  constructor,
       this constructor	is
	      a	constexpr constructor.
	    * This constructor does not	participate in overload	resolution un-
       less the
	      following	conditions are met:
		 * std::is_constructible_v<T, U&&> is true.
		 * std::decay_t<U>
		   (until C++20)
		   std::remove_cvref_t<U>
		   (since  C++20)  is  neither	std::in_place_t	 nor  std::op-
       tional<T>.
		 * If T	is (possibly cv-qualified) bool,
		   std::decay_t<U>
		   (until C++20)
		   std::remove_cvref_t<U>
		   (since C++20) is not	a specialization of std::optional.
	    * This constructor is explicit if  and  only  if  std::is_convert-
       ible_v<U&&, T> is
	      false.

Parameters
	  other	  - another optional object whose contained value is copied
	  value	  - value with which to	initialize the contained value
	  args... - arguments with which to initialize the contained value
	  ilist	   -  initializer  list	with which to initialize the contained
       value

Exceptions
	  2) Throws any	exception thrown by the	constructor of T.
	  3) Throws any	exception thrown by the	constructor of T. Has the fol-
       lowing
	  noexcept specification:
	  noexcept(std::is_nothrow_move_constructible<T>::value)
	  4-8) Throws any exception thrown by the constructor of T.

	  Deduction guides

Notes
	  Before the resolution	of LWG issue 3836,  constructing  an  std::op-
       tional<bool> from
	  std::optional<U>  would  select  overload  (8)  instead of overloads
       (4,5) if	U is not
	  bool.	This is	because	overloads (4,5)	did not	participate  in	 over-
       load resolution if
	  T  (bool in this case) can be	constructed or converted from std::op-
       tional<U>, but
	  std::optional::operator bool makes the conversion possible  for  any
       U.

	  As  a	 result, the constructed std::optional<bool> always contains a
       value. That value
	  is determined	by whether the provided	std::optional<U>  object  con-
       tains a value,
	  rather  than	the  bool  value direct-initialized from the contained
       value:

	std::optional<bool> op_false(false);
	std::optional<int> op_zero(0);

	std::optional<int> from_bool(op_false);	// OK: contains	0 (initialized
       from false)
	std::optional<bool> from_int(op_0);	// DEFECT (LWG 3836): contains
       true
						//  because  op_0  contains  a
       value, even if
						// initializing	bool from that
       value gives false

Example
       // Run this code

	#include <iostream>
	#include <optional>
	#include <string>

	int main()
	{
	    std::optional<int> o1, // empty
			       o2 = 1, // init from rvalue
			       o3 = o2;	// copy-constructor

	    // calls std::string( initializer_list<CharT> ) constructor
	    std::optional<std::string> o4(std::in_place, {'a', 'b', 'c'});

	    // calls std::string( size_type count, CharT ch ) constructor
	    std::optional<std::string> o5(std::in_place, 3, 'A');

	    // Move-constructed	from std::string using deduction guide to pick
       the type

	    std::optional o6(std::string{"deduction"});

	    std::cout << *o2 <<	' ' << *o3 << '	' << *o4 << ' '	<< *o5	<< ' '
       << *o6 << '\n';
	}

Output:
	1 1 abc	AAA deduction

	  Defect reports

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

	     DR	       Applied	   to		   Behavior    as    published
       Correct behavior
			      when constructing	an  std::optional<bool>	   al-
       ways selects the
	  LWG  3836 C++17      from std::optional<U>, the overload	  con-
       verting copy/move
			      resolution				  con-
       structor	in this
			      would select overload (8)	if U is	not bool case
			      copy/move	 constructors  might not be	   re-
       quired to
	  P0602R4  C++17      trivial					 prop-
       agate triviality
			      even if underlying constructor is	trivial
			      converting constructors from another
	  P2231R1  C++20      std::optional was				  made
       constexpr
			      not constexpr while the required
			      operations can be	in C++20

See also
	  make_optional	creates	an optional object
	  (C++17)	(function template)

Category:
	    * conditionally noexcept

http://cppreference.com		  2024.06.10	    std::optional::optional(3)

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

home | help