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>> 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) | |
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) | |
template<class CharT, class Traits, class Alloc = std::allocator<CharT>>> basic_string(std::basic_string_view<CharT, Traits>, typename /*voir ci-dessous*/::size_type, typename /*voir ci-dessous*/::size_type, const Alloc& = Alloc()) -> basic_string<CharT, Traits, Alloc>; |
(3) | |
InputIt statisfait LegacyInputIterator et Alloc satisfait Allocator.size_type dans (3) fait référence au type membre size_type du type déduit par le guide de déduction. Ces surcharges participent seulement dans la résolution de surcharges si 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.
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.
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 |
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
}