deduction guides for std::basic_string
Déclaré dans l'en-tête <string>
|
||
template<class InputIt, class Alloc = std::allocator< typename std::iterator_traits<InputIt>::value_type>> |
(1) | |
template<class CharT, class Traits, |
(2) | |
template<class CharT, class Traits, |
(3) | |
InputIt
statisfait LegacyInputIterator et Alloc
satisfait Allocator.Alloc
satisfait Allocator.Note: le point jusque où la bibliothèque détermine qu'un type ne satisfait pas LegacyInputIterator n'est pas spéficié, hormis qu'au minimum les types intégrals ne sont pas qualifiés d'itérateurs d'entrée. De même, le point jusque où elle détermine qu'un type ne satisfait pas Allocator n'est pas spécifié, hormis qu'au minimum le type membre Alloc::value_type
doit exister et l'expression std::declval<Alloc&>().allocate(std::size_t{}) doit être bien-formée lorsque traitée comme une opérande non-évaluée.
[modifier] Notes
Les guides (2-3) sont nécessaires puisque les constructeurs de std::basic_string pour std::basic_string_views sont des modèles pour éviter de causer des ambiguités dans le code existant, et ces modèles ne permettent pas la déduction d'argument de modèle de classe.
[modifier] Rapports de défauts
Ces rapports de défauts ayant changés le comportement du language ont été appliqués rétroactivement aux standards C++ publiés précédement.
RD | Appliqué à | Comportement tel que publié | Comportement correct |
---|---|---|---|
LWG 3075 | C++17 | la déduction depuis basic_string_view n'était pas possible (aggravé par le problème LWG 2946)
|
guides de déduction ajoutés |
[modifier] Exemple
#include <string> #include <vector> int main() { std::vector<char> v = {'a', 'b', 'c'}; std::basic_string s(v.begin(), v.end()); // utilise les guides de déductions }