
C ++ 17 рдорд╛рдирдХ рдиреЗ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдирдИ рд╕реБрд╡рд┐рдзрд╛ рдЬреЛрдбрд╝реА: рдХреНрд▓рд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рдХрдЯреМрддреА (CTAD) ред рд╕реА ++ рдореЗрдВ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдВрдЧреЛрдВ рдХреА рд╢реВрдЯрд┐рдВрдЧ рдХреЗ рдирдП рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ CTAD рдХреНрдпрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЬреАрд╡рди рдХреЛ рдХреИрд╕реЗ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдХреНрдпрд╛ рдиреБрдХрд╕рд╛рди рд╣реИрдВред
рджреВрд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рдХрдЯреМрддреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╕реА ++ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдкрд░реНрдпрд╛рдкреНрдд рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддреБрд░рдВрдд рдЕрдЧрд▓реЗ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
C ++ 17 рд╕реЗ рдкрд╣рд▓реЗ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдХрд┐рд╕реА рдлрдВрдХреНрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдЙрди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рддрд░реНрдХреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрдЯреМрддреА рдХрд░рдиреЗ рдХреЗ рдирд┐рдпрдо рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИрдВ, рд╡реЗ рдорд╛рдирдХ [temp.deduct] рдореЗрдВ рдкреВрд░реЗ рдЦрдВрдб 17.9.2 рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ (рдЗрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдорд╛рдирдХ рдХреЗ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реВрдВ; рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ, рдЕрдиреБрднрд╛рдЧ рдХреНрд░рдорд╛рдВрдХ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдореЗрдиреЗрдореЛрдирд┐рдХ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ; рд╡рд░реНрдЧ рдХреЛрд╖реНрдардХ)ред
рд╣рдо рдЗрди рдирд┐рдпрдореЛрдВ рдХреА рд╕рднреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ; рдЗрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗрд╡рд▓ рдХрдВрдкрд╛рдЗрд▓рд░ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╣реЛрддреА рд╣реИред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдирд┐рдпрдо рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ: рд╕рдВрдХрд▓рдХ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ рдЙрдкрд▓рдмреНрдз рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдорд╛рдирдХ рдкрд░рд┐рд╡рд░реНрддрди рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ (рд╢рд╛рдмреНрджрд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдХреЙрд╕реНрдЯ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ , рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдХреЗрдд рддрдХ рдХрдо рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдлрд╝рдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрдо рдХрд░ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЖрджрд┐)ред
template <typename T> void func(T t) {
рдпрд╣ рд╕рдм рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдЕрдлрд╕реЛрд╕, рдХреНрд▓рд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдкрдпреБрдХреНрдд рд╣реИред рдХреНрд▓рд╛рд╕ рдХреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд░рддреЗ рд╕рдордп, рд╕рднреА рдЧреИрд░-рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рдерд╛ред рдЗрд╕ рдЕрдкреНрд░рд┐рдп рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдХрд╛рд░рдг, рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ Make_ рдЙрдкрд╕рд░реНрдЧ рдХреЗ рд╕рд╛рде рдореБрдХреНрдд рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдкрд░рд┐рд╡рд╛рд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ: make_unique , make_sared , make_pair , make_tuple , рдЖрджрд┐ред
C ++ 17 рдореЗрдВ рдирдпрд╛
рдирдП рдорд╛рдирдХ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирддрд╛ рд╕реЗ, рдХреНрд▓рд╛рд╕ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рддрдерд╛рдХрдерд┐рдд рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
std::pair pr(false, 45.67);
рддреБрд░рдВрдд рдпрд╣ CTAD рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдЬреЛ C ++ 17 рдХреЗ рд╕рдордп рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рдпреЗ рдкреНрд░рддрд┐рдмрдВрдз рдорд╛рдирдХ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗ):
- CTAD рдЯреЗрдореНрдкрд▓реЗрдЯ рдПрд▓рд┐рдпрд╛рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ:
template <typename X> using PairIntX = std::pair<int, X>; PairIntX p{1, true};
- CTAD рддрд░реНрдХреЛрдВ рдХреЗ рдЖрдВрд╢рд┐рдХ рдЙрддреНрдкрд╛рджрди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ (рдпрд╣ рдирд┐рдпрдорд┐рдд рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рдХрдЯреМрддреА рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ):
std::pair p{1, 5};
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд╛рдг рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдХрдВрдЯреЗрдирд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ рдЬреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
template <typename T> struct MyVector { template <typename It> MyVector(It from, It to); }; std::vector<double> dv = {1.0, 3.0, 5.0, 7.0}; MyVector v2{dv.begin(), dv.end()};
рдкреНрд░рдХрд╛рд░ рдпрд╣ рд╕реАрдзреЗ рдЯреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╕реАрдзреЗ рдЕрд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реА ++ 17 рдореЗрдВ рдПрдХ рдирдИ рднрд╛рд╖рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ - рдХрдЯреМрддреА рдЧрд╛рдЗрдб , рдЬрд┐рд╕реЗ рд╣рдо рдЕрдЧрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред
рд╕рдорд░реНрдкрдг рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ
рдКрдкрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдЯреМрддреА рдЧрд╛рдЗрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
template <typename It> MyVector(It, It) -> MyVector<typename std::iterator_traits<It>::value_type>;
рдпрд╣рд╛рдВ рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде, рдЖрдк рдирд┐рд░реНрдорд╛рдг std::iterator_traits<It>::value_type
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ T рдХрд╛ рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХрдЯреМрддреА рдЧрд╛рдЗрдб рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рд╣рд░ рд╣реИрдВ, рдпрд╣ рдЖрдкрдХреЛ рд╕реА ++ рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рд╕рд╣рд┐рдд рдмрд╛рд╣рд░реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдХрдЯреМрддреА рдЧрд╛рдЗрдбреЛрдВ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдПрдХ рдФрдкрдЪрд╛рд░рд┐рдХ рд╡рд┐рд╡рд░рдг C ++ рдорд╛рдирдХ 17 рдореЗрдВ рдзрд╛рд░рд╛ 17.10 рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ [temp.deduct.nide] :
[explicit] template-name (parameter-declaration-clause) -> simple-template-id;
рдХрдЯреМрддреА рдЧрд╛рдЗрдб рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдкрд╖реНрдЯ рдХреАрд╡рд░реНрдб рдХреЙрдкреА-рд╕реВрдЪреА-рдкреНрд░рд╛рд░рдВрдн рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдордирд╛ рдХрд░рддрд╛ рд╣реИ :
template <typename It> explicit MyVector(It, It) -> MyVector<typename std::iterator_traits<It>::value_type>; std::vector<double> dv = {1.0, 3.0, 5.0, 7.0}; MyVector v2{dv.begin(), dv.end()};
рд╡реИрд╕реЗ, рдХрдЯреМрддреА рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдХрд╛ рдХреЛрдИ рдЦрд╛рдХрд╛ рдирд╣реАрдВ рд╣реИ:
template<class T> struct S { S(T); }; S(char const*) -> S<std::string>; S s{"hello"};
рд╡рд┐рд╕реНрддреГрдд CTAD рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
рдХрдХреНрд╖рд╛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрдкрдЪрд╛рд░рд┐рдХ рдирд┐рдпрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди C ++ рдорд╛рдирдХ 17 рдХреЗ рдЦрдВрдб 16.3.1.8 [over.match.class.deduct] рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдЗрдП рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред
рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рдХрд╛рд░ C рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП CTAD рд▓рд╛рдЧреВ рд╣реИред рд╕реА рдХреЗ рд▓рд┐рдП рдХрд┐рд╕ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдХрд┐рд╕ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ:
- рдкреНрд░рддреНрдпреЗрдХ рд╕реАрдЖрдИ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП, рдПрдХ рдбрдореА рдлрд╛рдИ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИред рд╕реАрдЖрдИ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реА рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рдж рд╕реАрдЖрдИ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ), рдЬрд┐рд╕рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╡рд╛рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред Fi рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░, рд╕реАрдЖрдИ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддреЗ рд╣реИрдВред C рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдбрдореА рдлрд╝рдВрдХреНрд╢рди Fi рдЯрд╛рдЗрдк C рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдЫрджреНрдо рдХреЛрдб:
template <typename T, typename U> class C { public: template <typename V, typename W = A> C(V, W); };
- рдпрджрд┐ рдЯрд╛рдЗрдк C рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╛ рдХреЛрдИ рдирд┐рд░реНрдорд╛рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЙрдкрд░реЛрдХреНрдд рдирд┐рдпрдо рдХрд╛рд▓реНрдкрдирд┐рдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ C () рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред
- C ┬й рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдбрдореА рдлрд╝рдВрдХреНрд╢рди рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рд╡реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдирд╛рдо рдХреЗ рд╕рд╛рде рднреА рдЖрдП: рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХрдЯреМрддреА рдЙрдореНрдореАрджрд╡рд╛рд░ ред
- рдкреНрд░рддреНрдпреЗрдХ рдХрдЯреМрддреА рдЧрд╛рдЗрдб рдХреЗ рд▓рд┐рдП , рдПрдХ рдбрдореА рдлрдВрдХреНрд╢рди Fi рдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдбрд┐рдбрдХреНрд╢рди рдЧрд╛рдЗрдб рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрдЯреМрддреА рдЧрд╛рдЗрдб рдореЗрдВ -> рдХреЗ рджрд╛рдИрдВ рдУрд░ рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди рд╣реЛрддрд╛ рд╣реИ (рдФрдкрдЪрд╛рд░рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдЗрд╕реЗ рд╕рд░рд▓-рдЯреЗрдореНрдкрд▓реЗрдЯ-рдЖрдИрдбреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ )ред
рдЫрджреНрдо рдХреЛрдб:
template <typename T, typename V> C(T, V) -> C<typename DT<T>, typename DT<V>>;
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлрд╛рдИ рдбрдореА рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдкрд░рд┐рдгрд╛рдореА рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдУрд╡рд░рд▓реЛрдб рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ: рдЬрдм рдбрдореА рдлрдВрдХреНрд╢рди рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХрд▓ cv U рдХреЗ рдПрдХрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ U рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬрд╝реЗрд╢рди C рдпрд╛ рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬрд╝реЗрд╢рди C рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИред (рдмрд╕ рдЕрдЧрд░ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рдХрд░реВрдВ рдХрд┐ cv == const рд╡рд╛рд╖реНрдкрд╢реАрд▓ ; рдЗрд╕ рддрд░рд╣ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЕрд░реНрде рд╣реИ U , const U , рдЕрд╕реНрдерд┐рд░ U рдФрд░ const рд╡рд╛рд╖реНрдкрд╢реАрд▓ U рдХрд╛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рд╡рд╣ рдирд┐рдпрдо рдЬреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ C(std::initializer_list<>)
рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреЗрддрд╛ C(std::initializer_list<>)
рд╕реВрдЪреА рдХреА рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП Lization рдХреЛ C ++ Standard 17 рдХреЗ рдЦрдВрдб 16.3.1.7 [over.match.list] рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:
std::vector v1{1, 2};
рдЕрдВрдд рдореЗрдВ, рдпрджрд┐ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдбрдореА рдлрд╝рдВрдХреНрд╢рди рдЪреБрдирдирд╛ рд╕рдВрднрд╡ рдерд╛, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдпрд╛ рдХрдЯреМрддреА рдЧрд╛рдЗрдб рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИрдВ, рдпрд╛ рдХрдИ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИред
рдиреБрдХрд╕рд╛рди
CTAD рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ C ++ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред C ++ 11 рдореЗрдВ рд╡рд░реНрджреА рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЗ рдкреИрд░ рд╕реЗ рдЧреЛрд▓реА рдорд╛рд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗрд╡рд▓ рдмрдврд╝реЗ рд╣реИрдВред рдЕрдм рдЖрдк рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдЧреЛрд▓ рдФрд░ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реИрдХреЗрдЯ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпреЗ рджреЛрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рд╕рдорд╛рди рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ:
std::vector v1{8, 15};
рдЕрдм рддрдХ, рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рддрд╛рд░реНрдХрд┐рдХ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ: v1 рдФрд░ v3 рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ std::initializer_list<int>
рд▓реЗрддрд╛ рд╣реИ, int рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ; v4 рдХреЛ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк рдЗрдВрдЯ рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпреЗ рдЕрднреА рднреА рдлреВрд▓ рд╣реИрдВ, рд╕рд╛рдордиреЗ рдЬрд╛рдореБрди:
std::vector v5{"hi", "world"};
v5 , рдЬреИрд╕рд╛ рдХрд┐ рдЕрдкреЗрдХреНрд╖рд┐рдд рдерд╛, std::vector<const char*>
рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛ std::vector<const char*>
рдФрд░ рджреЛ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдЕрд▓рдЧ рдХрд░рддреА рд╣реИред рдПрдХ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ:
template< class InputIt > vector( InputIt first, InputIt last, const Allocator& alloc = Allocator() );
std::vector
рд▓рд┐рдП рдХрдЯреМрддреА рдЧрд╛рдЗрдб рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж std::vector
"рд╣рд╛рдп" рдФрд░ "рджреБрдирд┐рдпрд╛" рдХреЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ "рдмреАрдЪ рдореЗрдВ" рдЭреВрда рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ std::vector<char>
рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ std::vector<char>
ред рдпрджрд┐ рд╣рдо рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ рдФрд░ рдпреЗ рджреЛрдиреЛрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реНрдерд┐рд░рд╛рдВрдХ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдореЗрдореЛрд░реА рдореЗрдВ рд╣реИрдВ, рддреЛ рддреАрди рддрддреНрд╡ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдПрдВрдЧреЗ: 'h', 'i', '\ x00', рд▓реЗрдХрд┐рди, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рд╕реЗ рдореЗрдореЛрд░реА рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрдЧрд╛ рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛
рдбреНрд░рд╛рдлреНрдЯ рдорд╛рдирдХ C ++ 17
CTAD
CppCon 2018: Stephan T. Lavavej "рд╕рднреА рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рдХрдЯреМрддреА"