Namensräume
Varianten
Aktionen

Deduktionshilfen für std::basic_string

Von cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
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 /* siehe unten */::size_type,
              typename /* siehe unten */::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 Deduktionshilfe wird für std::basic_string bereitgestellt, um die Deduktion aus einem Iterator-Bereich zu ermöglichen. Diese Überladung nimmt nur an der Überladungspreisentscheidung teil, wenn InputIt LegacyInputIterator erfüllt und Alloc Allocator erfüllt.
2,3) Diese Deduktionshilfen werden für std::basic_string bereitgestellt, um die Deduktion aus einem std::basic_string_view zu ermöglichen. Der Parameter-Typ size_type in (3) bezieht sich auf den Member-Typ size_type des Typs, der durch die Deduktionshilfe abgeleitet wird. Diese Überladungen nehmen nur an der Überladungspreisentscheidung teil, wenn Alloc Allocator erfüllt.
4) Diese Deduktionshilfe wird für std::basic_string bereitgestellt, um die Deduktion aus einem std::from_range_t-Tag und einem input_range zu ermöglichen.

Hinweis: Das Ausmaß, in dem die Bibliothek feststellt, dass ein Typ LegacyInputIterator nicht erfüllt, ist undefiniert, außer dass als Minimum ganzzahlige Typen nicht als Eingabeiteratoren qualifizieren. Ebenso ist das Ausmaß, in dem die Bibliothek feststellt, dass ein Typ Allocator nicht erfüllt, undefiniert, außer dass als Minimum der Member-Typ Alloc::value_type existieren muss und der Ausdruck std::declval<Alloc&>().allocate(std::size_t{}) gut gebildet sein muss, wenn er als nicht ausgewerteter Operand behandelt wird.

Inhalt

[bearbeiten] Hinweise

Die Hilfen (2,3) sind erforderlich, da die Konstruktoren von std::basic_string für std::basic_string_views Vorlagen sind, um Mehrdeutigkeiten in bestehendem Code zu vermeiden, und diese Vorlagen unterstützen keine Klassenvorlagenargumentableitung.

[bearbeiten] Hinweise

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

[bearbeiten] Beispiel

#include <cassert>
#include <string>
#include <vector>
 
int main()
{
    std::vector<char> v = {'a', 'b', 'c'};
    std::basic_string s1(v.begin(), v.end()); // uses 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); // uses deduction guide (4)
    assert(s4 == L"C++23");
#endif
}

[bearbeiten] 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 Deduction von basic_string_view wurde nicht unterstützt (verschärft durch LWG-Problem 2946) Deduktionshilfen hinzugefügt