Guías de deducción para std::basic_string
| Definido en el archivo de encabezado <string>
|
||
template<typename InputIt, typename 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<typename CharT, typename Traits, typename 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<typename CharT, typename Traits, typename Alloc = std::allocator<CharT>>> basic_string(std::basic_string_view<CharT, Traits>, typename /*véase más abajo*/::size_type, typename /*véase más abajo*/::size_type, const Alloc& = Alloc()) -> basic_string<CharT, Traits, Alloc>; |
(3) | (desde C++17) |
InputIt satisface a InputIterator y Alloc satisface a Allocator.size_type en (3) se refiere al tipo miembro size_type del tipo deducido por la guía de deducción. Estas sobrecargas solo participan en la resolución de sobrecargas si Alloc satisface a Allocator.Nota: no se especifica hasta qué grado la biblioteca determina que un tipo no satisface a IteradorDeEntradaLegado, excepto que, como mínimo, los tipos enteros no califican como iteradores de entrada. Del mismo modo, no se especifica en qué medida se determina que un tipo no satisface a Allocator, 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 trate como un operando no evaluado.
Notas
Las guías (2-3) se necesitan porque los constructores de std::basic_string para vistas sobre cadena, std::basic_string_view, están hechos plantillas para evitar causar ambigüedades en código existente, y esas plantillas no soportan la deducción de argumentos de plantillas de clase.
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 3075 | C++17 | La deducción desde una vista sobre cadena, basic_string_view,no se soportaba (exacerbado por Asunto LWG 2946). |
Se añadieron las guías de deducción. |
Ejemplo
#include <string>
#include <vector>
int main() {
std::vector<char> v = {'a', 'b', 'c'};
std::basic_string s(v.begin(), v.end()); // utiliza guía de deducción explícita
}