deduction guides for std::basic_string
| Dclar dans l'en-tte <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 rfrence au type membre size_type du type dduit par le guide de dduction. Ces surcharges participent seulement dans la rsolution de surcharges si Alloc satisfait Allocator.Note: le point jusque o la bibliothque dtermine qu'un type ne satisfait pas LegacyInputIterator n'est pas spfici, hormis qu'au minimum les types intgrals ne sont pas qualifis d'itrateurs d'entre. De mme, le point jusque o elle dtermine qu'un type ne satisfait pas Allocator n'est pas spcifi, 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-forme lorsque traite comme une oprande non-value.
Notes
Les guides (2-3) sont ncessaires puisque les constructeurs de std::basic_string pour std::basic_string_views sont des modles pour viter de causer des ambiguits dans le code existant, et ces modles ne permettent pas la dduction d'argument de modle de classe.
Rapports de dfauts
Ces rapports de dfauts ayant changs le comportement du language ont t appliqus rtroactivement aux standards C++ publis prcdement.
| RD | Appliqu | Comportement tel que publi | Comportement correct |
|---|---|---|---|
| LWG 3075 | C++17 | la dduction depuis basic_string_view n'tait pas possible (aggrav par le problme LWG 2946)
|
guides de dduction ajouts |
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 dductions
}