Guías de deducción para std::basic_string
Definido en el archivo de encabezado <string> | ||
template<typename InputIt, typename Alloc =std::allocator< typenamestd::iterator_traits<InputIt>::value_type>> | (1) | (desde C++17) |
template<typename CharT, typename Traits, | (2) | (desde C++17) |
template<typename CharT, typename Traits, | (3) | (desde C++17) |
InputIt
satisface a InputIterator y Alloc
satisface a Allocator.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.
[editar] 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.
[editar] 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. |
[editar]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}