Namespaces
Variants

Deduktionsanleitungen für std::basic_string

From de.cppreference.net
 
 
 
std::basic_string
 
Definiert in Header <string>
template< class InputIt, class Alloc = std::allocator<
                             typename std::iterator_traits<InputIt>::value_type> >
basic_string( InputIt, InputIt, Alloc = Alloc() )
    -> basic_string<typename std::iterator_traits<InputIt>::value_type,
                    std::char_traits<
                        typename std::iterator_traits<InputIt>::value_type>, Alloc>;
(1) (seit C++17)
template< class CharT,
          class Traits,
          class Alloc = std::allocator<CharT> >
explicit basic_string( std::basic_string_view<CharT, Traits>, const Alloc& = Alloc() )
    -> basic_string<CharT, Traits, Alloc>;
(2) (seit C++17)
template< class CharT,
          class Traits,
          class Alloc = std::allocator<CharT>> >
basic_string( std::basic_string_view<CharT, Traits>,
              typename /* see below */::size_type,
              typename /* see below */::size_type,
              const Alloc& = Alloc() )
    -> basic_string<CharT, Traits, Alloc>;
(3) (seit C++17)
template< ranges::input_range R,
          class Alloc = std::allocator<ranges::range_value_t<R>> >
basic_string( std::from_range_t, R&&, Alloc = Alloc() )
    -> basic_string<ranges::range_value_t<R>,
                       std::char_traits<ranges::range_value_t<R>>, Alloc>;
(4) (seit C++23)
1) Diese Deduktionsanleitung wird für std::basic_string bereitgestellt, um eine Deduktion aus einem Iteratorbereich zu ermöglichen. Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn InputIt LegacyInputIterator erfüllt und Alloc Allocator erfüllt.
2,3) Diese Deduktionsanleitungen werden für std::basic_string bereitgestellt, um eine Deduktion aus einem std::basic_string_view zu ermöglichen. Der size_type Parametertyp in (3) bezieht sich auf den size_type Mitgliedstyp des durch die Deduktionsanleitung abgeleiteten Typs. Diese Überladungen nehmen nur an der Überladungsauflösung teil, wenn Alloc Allocator erfüllt.
4) Diese Deduktionsanleitung wird für std::basic_string bereitgestellt, um eine Deduktion aus einem std::from_range_t-Tag und einem input_range zu ermöglichen.

Hinweis: Das Ausmaß, in dem die Bibliothek bestimmt, dass ein Typ LegacyInputIterator nicht erfüllt, ist unspezifiziert, außer dass mindestens integrale Typen nicht als Eingabe-Iteratoren qualifizieren. Ebenso ist das Ausmaß, in dem sie bestimmt, dass ein Typ Allocator nicht erfüllt, unspezifiziert, außer dass mindestens der Mitgliedstyp Alloc::value_type existieren und der Ausdruck std::declval<Alloc&>().allocate(std::size_t{}) wohlgeformt sein muss, wenn er als unevaluierter Operand behandelt wird.

Hinweise

Führungen ( 2,3 ) werden benötigt, weil die std::basic_string -Konstruktoren für std::basic_string_view s als Templates implementiert sind, um Mehrdeutigkeiten in bestehendem Code zu vermeiden, und diese Templates die Klassentemplate-Argumentableitung nicht unterstützen.

Hinweise

Feature-Test Makro Wert Std Feature
__cpp_lib_containers_ranges 202202L (C++23) Ranges-bewusste Konstruktion und Einfügung; Überladung ( 4 )

Beispiel

#include <cassert>
#include <string>
#include <vector>
int main()
{
    std::vector<char> v = {'a', 'b', 'c'};
    std::basic_string s1(v.begin(), v.end()); // verwendet Deduction Guide (1)
    assert(s1 == "abc");
#if __cpp_lib_containers_ranges >= 202202L
    std::vector<wchar_t> v4{0x43, 43, 053, 0x32, 0x33};
    std::basic_string s4(std::from_range, v4); // verwendet Deduction Guide (4)
    assert(s4 == L"C++23");
#endif
}

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3075 C++17 Deduktion von basic_string_view wurde nicht unterstützt
(verschärft durch LWG Issue 2946 )
Deduktionsanleitungen hinzugefügt