Namespaces
Variants

guides de déduction pour std::basic_string

Depuis fr.cppreference.net
 
 
 
std::basic_string
 
Défini dans l'en-tête <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) (depuis 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) (depuis 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) (depuis 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) (depuis C++23)
1) Ce guide de déduction est fourni pour std::basic_string afin de permettre la déduction à partir d'une plage d'itérateurs. Cette surcharge participe à la résolution de surcharge seulement si InputIt satisfait à LegacyInputIterator et que Alloc satisfait à Allocator.
2,3) Ces guides de déduction sont fournis pour std::basic_string afin de permettre la déduction à partir d'un std::basic_string_view. Le type du paramètre size_type dans (3) fait référence au type membre size_type du type déduit par le guide de déduction. Ces surcharges participent à la résolution de surcharge seulement si Alloc satisfait à Allocator.
4) Ce guide de déduction est fourni pour std::basic_string afin de permettre la déduction à partir d'une étiquette std::from_range_t et d'une input_range.

Remarque : la mesure dans laquelle la bibliothèque détermine qu'un type ne satisfait pas à LegacyInputIterator n'est pas spécifiée, sauf qu'au minimum les types intégraux ne sont pas qualifiés comme itérateurs d'entrée. De même, la mesure dans laquelle elle détermine qu'un type ne satisfait pas à Allocator n'est pas spécifiée, sauf qu'au minimum le type membre Alloc::value_type doit exister et que l'expression std::declval<Alloc&>().allocate(std::size_t{}) doit être bien formée lorsqu'elle est traitée comme un opérande non évalué.

Notes

Guides de déduction ( 2,3 ) sont nécessaires car les std::basic_string constructeurs pour les std::basic_string_view sont rendus templates pour éviter de causer des ambiguïtés dans le code existant, et ces templates ne prennent pas en charge la déduction d'arguments de template de classe.

Notes

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_containers_ranges 202202L (C++23) Construction et insertion compatibles avec les gammes ; surcharge ( 4 )

Exemple

#include <cassert>
#include <string>
#include <vector>
int main()
{
    std::vector<char> v = {'a', 'b', 'c'};
    std::basic_string s1(v.begin(), v.end()); // utilise le guide de déduction (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); // utilise le guide de déduction (4)
    assert(s4 == L"C++23");
#endif
}
Seul le texte "Run this code" a été traduit en "Exécuter ce code". Les commentaires en C++ ont également été traduits : - "// uses deduction guide (1)" → "// utilise le guide de déduction (1)" - "// uses deduction guide (4)" → "// utilise le guide de déduction (4)" Tous les autres éléments (balises HTML, code C++, attributs, termes techniques) ont été conservés intacts comme demandé.

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 3075 C++17 la déduction depuis basic_string_view n'était pas prise en charge
(exacerbé par LWG issue 2946 )
guides de déduction ajoutés