Guías de deducción para std::basic_string
De cppreference.com
| Definido en el archivo de encabezado |
||
|
|
(1) | (desde C++17) |
|
|
(2) | (desde C++17) |
|
|
(3) | (desde C++17) |
1) Esta guía de deducción se proporciona para std::basic_string para permitir la deducción desde un rango de iteradores. Esta sobrecarga solo participa en la resolución de sobrecargas si InputIt satisface a InputIterator y Alloc satisface a Allocator.
2-3) Estas guías de deducción se proporcionan para std::basic_string para permitir la deducción desde una vista sobre cadena, std::basic_string_view. El 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 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 }