Namespaces
Variants

guías de deducción para std::basic_string

De es.cppreference.net
 
 
 
std::basic_string
 
Definido en el encabezado <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) (desde 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) (desde 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) (desde 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) (desde C++23)
1) Esta guía de deducción se proporciona para std::basic_string para permitir la deducción a partir de un rango de iteradores. Esta sobrecarga participa en la resolución de sobrecargas solo si InputIt satisface LegacyInputIterator y Alloc satisface Allocator.
2,3) Estas guías de deducción se proporcionan para std::basic_string para permitir la deducción a partir de un std::basic_string_view. El tipo del parámetro size_type en (3) se refiere al tipo miembro size_type del tipo deducido por la guía de deducción. Estas sobrecargas participan en la resolución de sobrecargas solo si Alloc satisface Allocator.
4) Esta guía de deducción se proporciona para std::basic_string para permitir la deducción a partir de una etiqueta std::from_range_t y un input_range.

Nota: el grado en que la biblioteca determina que un tipo no satisface LegacyInputIterator no está especificado, excepto que, como mínimo, los tipos integrales no califican como iteradores de entrada. De manera similar, el grado en que se determina que un tipo no satisface Allocator no está especificado, excepto que, como mínimo, el tipo miembro Alloc::value_type debe existir y la expresión std::declval<Alloc&>().allocate(std::size_t{}) debe estar bien formada cuando se trata como un operando no evaluado.

Notas

Se necesitan guías de deducción ( 2,3 ) porque los constructores de std::basic_string para std::basic_string_view se implementan como plantillas para evitar causar ambigüedades en el código existente, y esas plantillas no admiten la deducción de argumentos de plantilla de clase.

Notas

Macro de prueba de características Valor Estándar Característica
__cpp_lib_containers_ranges 202202L (C++23) Construcción e inserción con reconocimiento de rangos; sobrecarga ( 4 )

Ejemplo

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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 3075 C++17 la deducción desde basic_string_view no estaba soportada
(agravado por LWG issue 2946 )
se añadieron guías de deducción