home | help
std::basic_...basic_string(3)  C++ Standard Libary std::basic_...basic_string(3)

NAME
     std::basic_string::basic_string - std::basic_string::basic_string

Synopsis
	basic_string(); 						    (un-
     til C++17)
	basic_string()				 noexcept(noexcept(Allocator()))
     (since C++17)
	    :	       basic_string(	      Allocator()	   )	      {}
     (constexpr since
									    C++20)
									    (noex-
     cept since
	explicit  basic_string(  const	Allocator&  alloc  );		     (2)
     C++17)
									    (con-
     stexpr since
									    C++20)
	basic_string(  size_type  count,  CharT  ch,			     (3)
     (constexpr since
		      const	Allocator&     alloc	 =     Allocator()    );
     C++20)
	basic_string(  const  basic_string&  other,  size_type	pos,	     (4)
     (constexpr since
		      const	Allocator&     alloc	 =     Allocator()    );
     C++20)
	constexpr basic_string( basic_string&& other, size_type
	pos,								     (5)
     (since C++23)
				const Allocator& alloc =
	Allocator() );
	basic_string( const basic_string& other,

		      size_type   pos,	 size_type  count,		     (6)
     (since C++23)

		      const Allocator& alloc = Allocator() );
	constexpr basic_string( basic_string&& other,

				size_type  pos,  size_type   count,	     (7)
     (since C++23)

				const Allocator& alloc =
	Allocator() );
	basic_string(  const  CharT*  s,  size_type  count,		     (8)
     (constexpr since
		      const    Allocator&     alloc	=     Allocator()     );
     C++20)
	basic_string(  const  CharT*  s,  const  Allocator&  alloc =	     (9)
     (constexpr since
	Allocator()							      );
     C++20)
	template< class InputIt >
									    (con-
     stexpr since
	basic_string(  InputIt	first,	InputIt  last,			(1) (10)
     C++20)

		      const Allocator& alloc = Allocator() );
	basic_string(  const  basic_string&  other  );			    (11)
     (constexpr since
									    C++20)
	basic_string(	 const	  basic_string&    other,    const    Allocator&
     (since C++11)
	alloc	);							    (12)
     (constexpr since
									    C++20)
									    (since
     C++11)
	basic_string(  basic_string&&  other  )  noexcept;		    (13)
     (constexpr since
									    C++20)
	basic_string(	basic_string&&	  other,    const    Allocator&    alloc
     (since C++11)
	);								    (14)
     (constexpr since
									    C++20)
	basic_string(		 std::initializer_list<CharT>		  ilist,
     (since C++11)
		      const  Allocator&  alloc	=  Allocator()	);	    (15)
     (constexpr since
									    C++20)
	template< class StringViewLike >
									    (since
     C++17)
	explicit  basic_string(  const	StringViewLike&  t,		    (16)
     (constexpr since
									    C++20)
			       const Allocator& alloc =
	Allocator() );
	template< class StringViewLike >
									    (since
     C++17)
	basic_string(  const  StringViewLike&  t,  size_type  pos,	    (17)
     (constexpr since
	size_type							      n,
     C++20)

		      const Allocator& alloc = Allocator() );
	basic_string(  std::nullptr_t  )  =  delete;			    (18)
     (since C++23)
	template< container-compatible-range<CharT> R >

	constexpr  basic_string(  std::from_range_t,  R&&  rg,		    (19)
     (since C++23)

				const Allocator& = Allocator());

	Constructs  new string from a variety of data sources and optionally us-
     ing user
	supplied allocator alloc.

	1,2) Default constructor. Constructs empty string (of zero size and  un-
     specified
	capacity). If no allocator is supplied, allocator is obtained from a
	default-constructed instance.
	3) Constructs the string with count copies of character ch.
	This  constructor  is  not used for class template argument deduction if
     the Allocator
	type that would be deduced does not qualify as an allocator.
	(since C++17)
	4-7) Constructs the string with a substring [pos, pos + count) of other.
     If count ==
	npos, if count is not specified, or if	the  requested	substring  lasts
     past the end of
	the string, the resulting substring is [pos, other.size()).
	If  other  is an rvalue reference, it is left in a valid but unspecified
     state.
	(since C++23)
	8) Constructs the string with the first count  characters  of  character
     string pointed
	to  by	s.  s  can  contain null characters. The length of the string is
     count. The
	behavior is undefined if [s, s + count) is not a valid range.
	9) Constructs the string with the contents initialized with  a	copy  of
     the
	null-terminated  character  string  pointed  to  by s. The length of the
     string is
	determined by the first null character. The behavior is undefined if [s,
     s +
	Traits::length(s)) is not a valid range (for example, if  s  is  a  null
     pointer).
	This  constructor  is  not used for class template argument deduction if
     the Allocator
	type that would be deduced does not qualify as an allocator.
	(since C++17)
	10) Constructs the string with the contents of the range [first, last).

	If InputIt is an integral type, equivalent to overload (2), as if by
	basic_string(static_cast<size_type>(first),
     (until C++11)
		     static_cast<value_type>(last), alloc).
	This constructor only participates in  overload  resolution  if  InputIt
     (since C++11)
	satisfies LegacyInputIterator.

	11,12)	Copy  constructor. Constructs the string with a copy of the con-
     tents of other.
	13,14) Move constructor. Constructs the  string  with  the  contents  of
     other using move
	semantics. other is left in valid, but unspecified state.
	15)  Constructs  the  string  with  the contents of the initializer list
     ilist.
	16) Implicitly converts t  to  a  string  view	sv  as	if  by	std::ba-
     sic_string_view<CharT,
	Traits> sv = t;, then initializes the string with the contents of sv, as
     if by
	basic_string(sv.data(), sv.size(), alloc).
	This overload participates in overload resolution only if
	std::is_convertible_v<const StringViewLike&,
			      std::basic_string_view<CharT, Traits>> is true and
	std::is_convertible_v<const StringViewLike&, const CharT*> is false.
	17)  Implicitly  converts  t  to  a  string  view  sv  as if by std::ba-
     sic_string_view<CharT,
	Traits> sv = t;, then initializes the string with the subrange [pos, pos
     + n) of sv
	as if by basic_string(sv.substr(pos, n), alloc).
	This overload participates in overload resolution only if
	std::is_convertible_v<const StringViewLike&,
			      std::basic_string_view<CharT, Traits>> is true.
	18) std::basic_string cannot be constructed from nullptr.
	19) Constructs the string with the values contained in the range rg.

Parameters
	alloc	    - allocator to use for all memory allocations of this string
	count	    - size of the resulting string
	ch	    - value to initialize the string with
	pos	    - position of the first character to include
	first, last - range to copy the characters from
	s	    - pointer to an array of characters to use as source to ini-
     tialize the
		      string with
	other	    - another string to use as source to initialize  the  string
     with
	ilist	    - std::initializer_list to initialize the string with
	t	    - object (convertible to std::basic_string_view) to initial-
     ize the
		      string with
	rg	    - a container compatible range

Complexity
	1,2) Constant.
	3-8) Linear in count.
	9) Linear in length of s.
	10) Linear in distance between first and last.
	11,12) Linear in size of other.
	13) Constant.
	14) Constant. If alloc is given and alloc != other.get_allocator(), then
     linear.
	15) Linear in size of ilist.
	16) Linear in size of t.
	17)  Linear  in size of assigned substring, i.e. std::min(std::size(t) -
     pos, n).
	19) Linear in size of rg.

Exceptions
	4-7) std::out_of_range if pos > other.size().
	13) Throws nothing.
	14) Throws nothing if alloc == str.get_allocator().
	17) std::out_of_range if pos is out of range.

	Throws std::length_error if the length of the constructed  string  would
     exceed
	max_size() (for example, if count > max_size() for (3)). Calls to
	Allocator::allocate may throw.

	If an exception is thrown for any reason, these functions have no effect
     (strong
	exception safety guarantee).

Notes
	Initialization with a string literal that contains embedded '\0' charac-
     ters uses the
	overload  (9),	which  stops  at  the  first null character. This can be
     avoided by
	specifying a different constructor or by using operator""s:

      std::string s1 = "ab\0\0cd";   // s1 contains "ab"
      std::string s2{"ab\0\0cd", 6}; // s2 contains "ab\0\0cd"
      std::string s3 = "ab\0\0cd"s;  // s3 contains "ab\0\0cd"

	    Feature-test macro	     Value    Std		    Feature
	__cpp_lib_containers_ranges 202202L (C++23) Tagged constructor	(19)  to
     construct
						    from   container  compatible
     range

Example
     // Run this code

      #include <cassert>
      #include <cctype>
      #include <iomanip>
      #include <iostream>
      #include <iterator>
      #include <string>

      int main()
      {
	  std::cout << "1) string(); ";
	  std::string s1;
	  assert(s1.empty() && (s1.length() == 0) && (s1.size() == 0));
	  std::cout << "s1.capacity(): " << s1.capacity() << '\n';  //	unspeci-
     fied

	  std::cout << "2) string(size_type count, CharT ch): ";
	  std::string s2(4, '=');
	  std::cout << std::quoted(s2) << '\n'; // "===="

	  std::cout  << "3) string(const string& other, size_type pos, size_type
     count): ";
	  std::string const other3("Exemplary");
	  std::string s3(other3, 0, other3.length() - 1);
	  std::cout << std::quoted(s3) << '\n'; // "Exemplar"

	  std::cout << "4) string(const string& other, size_type pos): ";
	  std::string const other4("Mutatis Mutandis");
	  std::string s4(other4, 8);
	  std::cout << std::quoted(s4) << '\n'; // "Mutandis", i.e. [8, 16)

	  std::cout << "5) string(CharT const* s, size_type count): ";
	  std::string s5("C-style string", 7);
	  std::cout << std::quoted(s5) << '\n'; // "C-style", i.e. [0, 7)

	  std::cout << "6) string(CharT const* s): ";
	  std::string s6("C-style\0string");
	  std::cout << std::quoted(s6) << '\n'; // "C-style"

	  std::cout << "7) string(InputIt first, InputIt last): ";
	  char mutable_c_str[] = "another C-style string";
	  std::string s7(std::begin(mutable_c_str) + 8,  std::end(mutable_c_str)
     - 1);
	  std::cout << std::quoted(s7) << '\n'; // "C-style string"

	  std::cout << "8) string(string&): ";
	  std::string const other8("Exemplar");
	  std::string s8(other8);
	  std::cout << std::quoted(s8) << '\n'; // "Exemplar"

	  std::cout << "9) string(string&&): ";
	  std::string s9(std::string("C++ by ") + std::string("example"));
	  std::cout << std::quoted(s9) << '\n'; // "C++ by example"

	  std::cout << "a) string(std::initializer_list<CharT>): ";
	  std::string sa({'C', '-', 's', 't', 'y', 'l', 'e'});
	  std::cout << std::quoted(sa) << '\n'; // "C-style"

	  // before C++11, overload resolution selects string(InputIt first, In-
     putIt last)
	  //  [with InputIt = int] which behaves *as if* string(size_type count,
     CharT ch)
	  // after C++11 the InputIt constructor is disabled for integral  types
     and calls:
	  std::cout << "b) string(size_type count, CharT ch) is called: ";
	  std::string sb(3, std::toupper('a'));
	  std::cout << std::quoted(sb) << '\n'; // "AAA"

      //  std::string sc(nullptr); // Before C++23: throws std::logic_error
				   //  Since  C++23: won't compile, see overload
     (18)
      //  std::string sc(0); // Same as above, as literal 0 is	a  null  pointer
     constant

	  auto const range = {0x43, 43, 43};
      #ifdef __cpp_lib_containers_ranges
	  std::string sc(std::from_range, range); // tagged constructor (19)
	  std::cout << "c) string(std::from_range, range) is called: ";
      #else
	  std::string  sc(range.begin(),  range.end());  // fallback to overload
     (12)
	  std::cout << "c) string(range.begin(), range.end()) is called: ";
      #endif
	  std::cout << std::quoted(sc) << '\n'; // "C++"
      }

Possible output:
      1) string(); s1.capacity(): 15
      2) string(size_type count, CharT ch): "===="
      3) string(const string& other, size_type pos, size_type count): "Exemplar"
      4) string(const string& other, size_type pos): "Mutandis"
      5) string(CharT const* s, size_type count): "C-style"
      6) string(CharT const* s): "C-style"
      7) string(InputIt first, InputIt last): "C-style string"
      8) string(string&): "Exemplar"
      9) string(string&&): "C++ by example"
      a) string(std::initializer_list<CharT>): "C-style"
      b) string(size_type count, CharT ch) is called: "AAA"
      c) string(std::from_range, range) is called: "C++"

	Defect reports

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

	   DR	 Applied to	  Behavior as published 	     Correct be-
     havior
			    overload (10) did not use the
	LWG 301  C++98	    parameter			      use that parameter
			    alloc if InputIt is an integral
			    type
	LWG  847   C++98      there was no exception safety	added strong ex-
     ception safety
			    guarantee			      guarantee
	LWG 2193 C++11	    the default constructor is	      made non-explicit
			    explicit
			    there is no way to supply an      there  is  a  con-
     structor for
	LWG  2583 C++98      allocator			       basic_string(str,
     pos, alloc)
			    for basic_string(str, pos)
	LWG 2946 C++17	    overload (16) causes ambiguity in avoided by  making
     it a
			    some cases			      template
			    two constructors may cause
	LWG 3076 C++17	    ambiguities 		      constrained
			    in class template argument
			    deduction

See also
	assign	      assign characters to a string
		      (public member function)
	operator=     assigns values to the string
		      (public member function)
	to_string     converts an integral or floating-point value to string
	(C++11)       (function)
	to_wstring    converts an integral or floating-point value to wstring
	(C++11)       (function)
		      constructs a basic_string_view
	constructor	   (public	member	    function	 of	std::ba-
     sic_string_view<CharT,Traits>)

http://cppreference.com 	   2024.06.10	   std::basic_...basic_string(3)

home | help