рд╕реА ++: рд╕рд╣рдЬ рдкреБрд░рд╛рддрддреНрд╡ рдХрд╛ рдПрдХ рд╕рддреНрд░ рдФрд░ рдЖрдкрдХреЛ рд╕реА рдХреА рд╢реИрд▓реА рдореЗрдВ рдЪрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рдпрд╣ рд╕рдм, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖред рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рд╣реИ рдЬрдм рдореИрдВрдиреЗ рдЬрд╛рд╡рд╛ рдиреЗрдЯрд┐рд╡ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рд╕реА ++ рднрд╛рдЧ рдореЗрдВ рдореИрдВрдиреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рдкреЗрдЯрд╛ рд╣реИ рдЬреЛ рдЬрд╛рд╡рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди - CallVoidMethod - рдЪрд░ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЬреЗрдПрдирдЖрдИ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдмрдирд╛рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ, рдФрд░ рддрдерд╛рдХрдерд┐рдд рд╡рд┐рдзрд┐ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛) рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛, рдпрд╣ рдЕрдиреНрдп рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рд▓реЗрддрд╛ рд╣реИред рдЬреЛ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрди рдЕрдиреНрдп рддрд░реНрдХреЛрдВ рдХреЛ рдЬрд╛рд╡рд╛ рдХреА рдУрд░ рд╕реЗ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рдеред

рддрджрдиреБрд╕рд╛рд░, рдореИрдВрдиреЗ рдЕрдкрдирд╛ рд░реИрдкрд░ рд╡реЗрд░рд┐рдПрдмрд▓ рднреА рдмрдирд╛рдпрд╛ред CallVoidMethod рд▓рд┐рдП рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CallVoidMethod va_list рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рднрд┐рдиреНрди рд╣реИред рд╣рд╛рдВ, рдпрд╣реА va_list рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдЬреЗрд╡реАрдПрдо рдмреИрдВрдХрд▓ рд╕реЗрдЧрдореЗрдВрдЯреЗрд╢рди рдлреЙрд▓реНрдЯ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ред

2 рдШрдВрдЯреЗ рдореЗрдВ рдореИрдВ 8 рд╡реАрдВ рд╕реЗ 11 рд╡реАрдВ рддрдХ рдЬреЗрд╡реАрдПрдо рдХреЗ рдХрдИ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛, рдХреНрдпреЛрдВрдХрд┐: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЬреЗрд╡реАрдПрдо рдХреЗ рд╕рд╛рде рдпрд╣ рдореЗрд░рд╛ рдкрд╣рд▓рд╛ рдЕрдиреБрднрд╡ рд╣реИ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореИрдВрдиреЗ рдЦреБрдж рд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╕реНрдЯреИрдХрдСрд╡рд░рдлреНрд▓реЛ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд┐рдпрд╛, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдХрд┐рд╕реА рдиреЗ рддрдм StackOverflow рдкрд░ рдореИрдВрдиреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ OpenJDK рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА, рд▓реЗрдХрд┐рди OracleJDK, рдФрд░ 8 рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ 10. рдФрд░ рддрднреА рдореИрдВрдиреЗ рдЕрдВрдд рдореЗрдВ рджреЗрдЦрд╛ рдХрд┐ рдЪрд░ CallVoidMethod рдЕрд▓рд╛рд╡рд╛ CallVoidMethodV , рдЬреЛ va_list рдорд╛рдзреНрдпрдо рд╕реЗ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рд▓реЗрддрд╛ рд╣реИред

рдореБрдЭреЗ рдЗрд╕ рдХрд╣рд╛рдиреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдмрд╛рдд рд╕рдмрд╕реЗ рдЬреНрдпрд╛рджрд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдИ, рд╡рд╣ рдпрд╣ рдереА рдХрд┐ рдореИрдВрдиреЗ va_list (рджреАрд░реНрдШрд╡реГрддреНрдд) рдФрд░ va_list рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рддреБрд░рдВрдд рдирд╣реАрдВ рджреЗрдЦрд╛ рдерд╛ред рдФрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдкрд░, рдореИрдВ рдЦреБрдж рдХреЛ рдирд╣реАрдВ рд╕рдордЭрд╛ рд╕рдХрд╛ рдХрд┐ рдореВрд▓рднреВрдд рдЕрдВрддрд░ рдХреНрдпрд╛ рдерд╛ред рддреЛ, рд╣рдореЗрдВ рджреАрд░реНрдШрд╡реГрддреНрдд рдХреЗ рд╕рд╛рде рдФрд░ va_list рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ (рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрднреА рднреА C ++ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ) рд╡реИрд░рд┐рдПрдмрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд▓рд┐рдПред

рдорд╛рдирдХ рдореЗрдВ ellipsis рдФрд░ va_list рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ


C ++ рдорд╛рдирдХ рдХреЗрд╡рд▓ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдФрд░ рдорд╛рдирдХ C. рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдорддрднреЗрджреЛрдВ рдкрд░ рд╕реНрд╡рдпрдВ рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдорд╛рдирдХ C рдХреНрдпрд╛ рдХрд╣рддрд╛ рд╣реИ (C89 рд╕реЗ рд╢реБрд░реВ)ред

  • рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИред рдпрд╛рдиреА рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдЕрдзрд┐рдХ рддрд░реНрдХ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рд╕реВрдЪреА рдПрдХ рджреАрд░реНрдШрд╡реГрддреНрдд рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ [C11 6.9.1 / 8] рднреА рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

     void foo(int parm1, int parm2, ...); 
  • рджреАрд░реНрдШрд╡реГрддреНрдд рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рддрд░реНрдХреЛрдВ рдФрд░ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╣реА рдирд╣реАрдВ рджреА рдЬрд╛рддреА рд╣реИред рдпрд╛рдиреА рдЕрдВрддрд┐рдо рдирд╛рдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ (рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ parm2 ) рдХреЗ рдмрд╛рдж [C11 6.7.6.3/9] ред
  • рдЗрди рддрд░реНрдХреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ <stdarg.h> рд╣реЗрдбрд░ рдФрд░ 4 (C11 рдорд╛рдирдХ рд╕реЗ рдкрд╣рд▓реЗ 3) рдореИрдХреНрд░реЛрдЬрд╝: va_start , va_arg , va_end рдФрд░ va_copy (C11 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ) [C11 7.16] рдореЗрдВ рдШреЛрд╖рд┐рдд va_list рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

    рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
     int add(int count, ...) { int result = 0; va_list args; va_start(args, count); for (int i = 0; i < count; ++i) { result += va_arg(args, int); } va_end(args); return result; } 

    рд╣рд╛рдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдХрд┐рддрдиреЗ рддрд░реНрдХ рд╣реИрдВред рдЙрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕ рдирдВрдмрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рдПрдХрд▓ рдирд╛рдорд┐рдд рддрд░реНрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ (рджреВрд╕рд░рд╛ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдХрд▓реНрдк рдЕрдВрддрд┐рдо рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ NULL рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ NULL , рдЬреИрд╕рд╛ рдХрд┐ execl рдпрд╛ 0 рдореЗрдВ рд╣реИ)ред
  • рдЕрдВрддрд┐рдо рдирд╛рдорд┐рдд рддрд░реНрдХ рдореЗрдВ register рд╕реНрдЯреЛрд░реЗрдЬ рдХреНрд▓рд╛рд╕ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдПрдХ рд╕рд░рдгреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ [C11 7.16.1.4/4] ред
  • рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдВрддрд┐рдо рдирд╛рдорд┐рдд рддрд░реНрдХ рдФрд░ рд╕рднреА рдирд╛рдорд╛рдВрдХрд┐рдд рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, " рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реНрдХ рдкрджреЛрдиреНрдирддрд┐ " рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИ ( рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реНрдХ рдкрджреЛрдиреНрдирддрд┐ ; рдпрджрд┐ рд░реВрд╕реА рдореЗрдВ рдЗрд╕ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЕрдиреБрд╡рд╛рдж рд╣реИ, рддреЛ рдореИрдВ рдЦрд╝реБрд╢реА рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ)ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рддрд░реНрдХ рдореЗрдВ char , short (рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛ рдЪрд┐рд╣реНрди) рдпрд╛ float , рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ int , int (рд╕рд╛рдЗрди рдХреЗ рд╕рд╛рде рдпрд╛ рдмрд┐рдирд╛) рдпрд╛ double рд░реВрдк рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдиреНрдпрдерд╛, рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ [C11 7.16.1.1/2] ред
  • va_list рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЗрд╡рд▓ рдпрд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ <stdarg.h> рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкреВрд░реНрдг рд╣реИ (рдЕрд░реНрдерд╛рдд, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдЖрдХрд╛рд░ рдЬреНрдЮрд╛рдд рд╣реИ) [C11 7.16 / 3] ред

рдХреНрдпреЛрдВ? рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐!


C рдореЗрдВ рдХрдИ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред va_list рдХреЛ рдорд╛рдирдХ рдореЗрдВ рдХреНрдпреЛрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдЧрд░ рдХрд┐рд╕реА рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ va_list рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рджреАрд░реНрдШрд╡реГрддреНрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЕрдм рдпрд╣ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: "рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рдХреЗ рд░реВрдк рдореЗрдВ", рд▓реЗрдХрд┐рди 40 рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ, рдЪреАрдиреА рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд╣реАрдВ рдерд╛ред

рдлрд┐рд▓рд┐рдк рдЬреЗрдореНрд╕ рдкреНрд▓реЙрдЧрд░ рдлрд┐рд▓рд┐рдк рдЬреЗрдореНрд╕ рдкреНрд▓реЗрдВрдЬрд░ рдкреБрд╕реНрддрдХ рдж рд╕реНрдЯреИрдВрдбрд░реНрдб рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА - 1992 рдореЗрдВ - рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реА рдХреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреАрдбреАрдкреА -11 рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рд╕рд░рд▓ рд╕реВрдЪрдХ рдЕрдВрдХрдЧрдгрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЫрд╛рдВрдЯрдирд╛ рд╕рдВрднрд╡ рдерд╛ред рд╕рдорд╕реНрдпрд╛ рд╕реА рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдФрд░ рд╕рдВрдХрд▓рдХ рдХреЗ рдЕрдиреНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдИ рджреАред рдмреНрд░рд╛рдпрди рдХреЗрд░рдирд┐рдШрди рдФрд░ рдбреЗрдирд┐рд╕ рд░рд┐рдЪреА рджреНрд╡рд╛рд░рд╛ рдж рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг - 1978 - рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ:
рд╡реИрд╕реЗ, рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдкреЛрд░реНрдЯреЗрдмрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХреЛрдИ рд╕реНрд╡реАрдХрд╛рд░реНрдп рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдкрд╛рд╕ рдХрд┐рддрдиреЗ рддрд░реНрдХ рд╣реИрдВред ... printf , рд╕рдмрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реА рднрд╛рд╖рд╛ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рддрд░реНрдХреЛрдВ рдХреА, ... рдкреЛрд░реНрдЯреЗрдмрд▓ рдирд╣реАрдВ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрд╣ рдкреБрд╕реНрддрдХ vprintf рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдЗрд╕рдХрд╛ рдХреЛрдИ vprintf рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдФрд░ рдореИрдХреНрд░реЛрдЬрд╝ va_* рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╡реЗ рд╕реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ (1988) рдХреЗ рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реА рд╕реНрдЯреИрдВрдбрд░реНрдб (C89, рдЙрд░реНрдл тАЛтАЛANSI C) рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд┐рддрд┐ рдХреА рдпреЛрдЧреНрдпрддрд╛ рд╣реИред рд╕рдорд┐рддрд┐ рдиреЗ <stdarg.h> рдХреЛ рдорд╛рдирдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛, рдЬреЛ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗ рд░рд╣рд╛ рд╣реИ <varargs.h> , UNIX OS рдХреА рдкреЛрд░реНрдЯреЗрдмрд┐рд▓рд┐рдЯреА рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рдХреНрд╖реНрдп рдХреЗ рд╕рд╛рде рдПрдВрдбреНрд░рдпреВ рдХреЛрдПрдирд┐рдЧ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ред va_* рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддрд╛рдХрд┐ рдореМрдЬреВрджрд╛ рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рдирдП рдорд╛рдирдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛред

рдЕрдм, C89 рдФрд░ va_* рдкрд░рд┐рд╡рд╛рд░ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рдкреЛрд░реНрдЯреЗрдмрд▓ рдЪрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рдЗрд╕ рдкрд░рд┐рд╡рд╛рд░ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдЕрднреА рднреА рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВред

рд╕рд░рд╛рд╕рд░ рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рд╕реЗ, рдЖрдк <stdarg.h> рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд╣реА "рд╕реА рд╕реНрдЯреИрдВрдбрд░реНрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА" рдмреЛрд░рд▓реИрдВрдб рдЯрд░реНрдмреЛ рд╕реА ++ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ :

рдмреЛрд░рд▓реИрдВрдб рдЯрд░реНрдмреЛ рд╕реА ++ рд╕реЗ <stdarg.h>
 #ifndef _STADARG #define _STADARG #define _AUPBND 1 #define _ADNBND 1 typedef char* va_list #define va_arg(ap, T) \ (*(T*)(((ap) += _Bnd(T, _AUPBND)) - _Bnd(T, _ADNBND))) #define va_end(ap) \ (void)0 #define va_start(ap, A) \ (void)((ap) = (char*)&(A) + _Bnd(A, _AUPBND)) #define _Bnd(X, bnd) \ (sizeof(X) + (bnd) & ~(bnd)) #endif 


AMD64 рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдирдпрд╛ SystemV ABI va_list рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ:

SystemV ABI AMD64 рдХрд╛ va_list
 typedef struct { unsigned int gp_offset; unsigned int fp_offset; void *overflow_arg_area; void *reg_save_area; } va_list[1]; 


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рдХрд╛рд░ рдФрд░ рдореИрдХреНрд░реЛ va_* рдПрдХ рдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ va_* рд▓рд┐рдП рдПрдХ рдорд╛рдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдХрд╛рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрдХрд▓рдХ, рд▓рдХреНрд╖реНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдФрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рджреАрд░реНрдШрд╡реГрддреНрдд (рдпрд╛рдиреА, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ рдЪрд░ рдХрд╛рд░реНрдп) рд╕реА рдореЗрдВ va_list (рдпрд╛рдиреА, рд╣реЗрдбрд░ <stdarg.h> ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдФрд░ va_list рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП va_list рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЕрдкрдиреЗ рдкреЛрд░реНрдЯреЗрдмрд▓ рдЪрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

C ++ рдореЛрдЯреЗ рддреМрд░ рдкрд░ C рдХреЗ рд╕рд╛рде рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдЙрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рднреА рд╣реИрдВред

C ++ рдореЗрдВ рдЪрд░ рдХрд╛рд░реНрдп


WG21 рд╡рд░реНрдХрд┐рдВрдЧ рдЧреНрд░реБрдк C ++ рд╕реНрдЯреИрдВрдбрд░реНрдб рдХреЗ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд░рд╣рд╛ рд╣реИред 1989 рдореЗрдВ, рдирд╡ рдирд┐рд░реНрдорд┐рдд C89 рдорд╛рдирдХ рдХреЛ рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдзреАрд░реЗ-рдзреАрд░реЗ рд╕реА ++ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рдЧрдпрд╛ред 1995 рдореЗрдВ, рдЬреЙрди рдорд╛рдЗрдХрдХреЛ рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡ N0695 рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ , рдЬрд┐рд╕рдореЗрдВ рд▓реЗрдЦрдХ рдиреЗ рдореИрдХреНрд░реЛрдЬрд╝ va_* рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛:

  • рдХреНрдпреЛрдВрдХрд┐ C ++, C рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдкрдХреЛ рдЪрд░ рдХрд╛ register рдкрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдлрд┐рд░ рдХрд┐рд╕реА рдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрддрд┐рдо рдирд╛рдорд┐рдд рддрд░реНрдХ рдореЗрдВ рдпрд╣ рд╕рдВрдЧреНрд░рд╣рдг рд╡рд░реНрдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  • рдХреНрдпреЛрдВрдХрд┐ рд╕реА ++ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рд▓рд┐рдВрдХ рд╕реА рдЪрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрд▓рд┐рдЦрд┐рдд рдирд┐рдпрдо рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реИрдВ - рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЖрдХрд╛рд░ рдЗрд╕рдХреЗ рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдлрд┐рд░ рдЕрдВрддрд┐рдо рдирд╛рдорд┐рдд рддрд░реНрдХ рдПрдХ рд▓рд┐рдВрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрдиреНрдпрдерд╛, рдЕрд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ред
  • рдХреНрдпреЛрдВрдХрд┐ C ++ рдореЗрдВ " рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рддрд░реНрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрдврд╝рд╛рдиреЗ " рдХреА рдХреЛрдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рд╡рд╛рдХреНрдпрд╛рдВрд╢
    рдпрджрд┐ рдкреИрд░рд╛рдореАрдЯрд░ parmN рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ... рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддрд░реНрдХ рдкрджреЛрдиреНрдирддрд┐ рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдмрд╛рдж рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рддреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ
    рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
    рдпрджрд┐ рдкреИрд░рд╛рдореАрдЯрд░ parmN рд╕рд╛рде рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ... рдПрдХ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдРрд╕рд╛ рддрд░реНрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИ
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рджрд░реНрдж рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рдХрд┐рдпрд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, C ++ рд╕реНрдЯреИрдВрдбрд░реНрдб рдореЗрдВ " рдбрд┐рдлреЙрд▓реНрдЯ рд▓реЙрдЬрд┐рдХ рдЯрд╛рдЗрдк рдПрд╕реНрдХреЗрд▓реЗрд╢рди " рд░рд╣рддрд╛ рд╣реИ [C ++ 17 8.2.2 / 9] ред рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдореИрдВ рдорд╛рдирдХ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдХреЗ рдЕрд░реНрде рдкрд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╣реИрд░рд╛рди рдерд╛, рдЬрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред N0695 рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдореБрдЭреЗ рдЖрдЦрд┐рд░ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛: рдореЗрд░рд╛ рдорддрд▓рдм рд╡рд╣реА рд╣реИред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕рднреА 3 рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛ [C ++ 98 18.7 / 3] ред C ++ рдореЗрдВ рд╡рд╛рдкрд╕, рдПрдХ рдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдПрдХ рдирд╛рдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдк рджреВрд╕рд░реЛрдВ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрд╕ рдкрд░ рдмрд╛рдж рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ) рдЧрд╛рдпрдм рд╣реЛ рдЧрдП рд╣реИрдВ, рдФрд░ рд╡реИрдз рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдирд╛рдо рддрд░реНрдХреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдХрдХреНрд╖рд╛ рд╕рджрд╕реНрдпреЛрдВ рдФрд░ рдкреАрдУрдбреА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

C ++ 03 рдорд╛рдирдХ рдиреЗ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ред C ++ 11 рдиреЗ рдЧреИрд░-рддреБрдЪреНрдЫ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рд╡рд┐рдзреНрд╡рдВрд╕рдХ [C ++ 11 5.2.2.2 / 7] рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдк std::nullptr_t рдХреЛ void* рдФрд░ рдЕрдиреБрдордд рд╕рдВрдХрд▓рдХ рдХреЗ рдЕрдкрдиреЗ рдЕрдирд╛рдо рддрд░реНрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред C ++ 14 рдиреЗ рдЕрдВрддрд┐рдо рдирд╛рдорд┐рдд рдкреИрд░рд╛рдореАрдЯрд░ [C ++ 14 18.10 / 3] рдХреЗ рд░реВрдк рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреА, рдФрд░ C ++ 17 рдиреЗ рд▓реИрдореНрдмреНрдбрд╛ рджреНрд╡рд╛рд░рд╛ рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЧрдП рд╡рд┐рд╕реНрддрд╛рд░ рдкреИрдХ рдФрд░ рдЪрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдордирд╛ рдХрд░ рджрд┐рдпрд╛ [C ++ 17 21.10.1 / рез] ред

рдирддреАрдЬрддрди, C ++ рдиреЗ рдЕрдкрдиреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рд▓рд┐рдП рд╡реИрд░рд┐рдПрдмрд▓ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗред рдЧреИрд░-рддреБрдЪреНрдЫ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ / рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рдЕрдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдорд░реНрдерди рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдиреАрдЪреЗ рдореИрдВ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдЪрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рднреА рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рдЗрд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред

рдЪрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


  1. рдкрджреЛрдиреНрдирдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЕрдВрддрд┐рдо рдирд╛рдорд┐рдд рддрд░реНрдХ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рдЧрд▓рдд рд╣реИ, рдЕрд░реНрдерд╛рдд char , signed char , unsigned char , singed short , рдПрдХ unsigned short рдпрд╛ float ред рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд░рд┐рдгрд╛рдо рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛ред

    рдЕрдорд╛рдиреНрдп рдХреЛрдб
     void foo(float n, ...) { va_list va; va_start(va, n); std::cout << va_arg(va, int) << std::endl; va_end(va); } 


    рд╕рднреА рд╕рдВрдХрд▓рдХ рдЬреЛ рдореЗрд░реЗ рд╣рд╛рде рдореЗрдВ рдереЗ (gcc, clang, MSVC), рдХреЗрд╡рд▓ рдХреНрд▓реИрдВрдЧ рдиреЗ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХреАред

    рджрдмрдВрдЧ рдЪреЗрддрд╛рд╡рдиреА
     ./test.cpp:7:18: warning: passing an object that undergoes default argument promotion to 'va_start' has undefined behavior [-Wvarargs] va_start(va, n); ^ 

    рдФрд░ рдпрджреНрдпрдкрд┐ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХреЛрдб рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

    рдпрд╣ рд╕рд╣реА рд╣реЛрдЧрд╛
     void foo(double n, ...) { va_list va; va_start(va, n); std::cout << va_arg(va, int) << std::endl; va_end(va); } 

  2. рдЕрдВрддрд┐рдо рдирд╛рдорд┐рдд рддрд░реНрдХ рдХреЛ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдЧрд▓рдд рд╣реИред рдХреЛрдИ рд▓рд┐рдВрдХред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдорд╛рдирдХ рднреА рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИред

    рдЕрдорд╛рдиреНрдп рдХреЛрдб
     void foo(int& n, ...) { va_list va; va_start(va, n); std::cout << va_arg(va, int) << std::endl; va_end(va); } 

    gcc 7.3.0 рдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ред lang 6.0.0 рдиреЗ рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХреА, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ред

    рджрдмрдВрдЧ рдЪреЗрддрд╛рд╡рдиреА
     ./test.cpp:7:18: warning: passing an object of reference type to 'va_start' has undefined behavior [-Wvarargs] va_start(va, n); ^ 

    рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдХрд╛рд░реНрдпрдХреНрд░рдо рдиреЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ (рднрд╛рдЧреНрдпрд╢рд╛рд▓реА, рдЖрдк рдЗрд╕ рдкрд░ рднрд░реЛрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рд▓реЗрдХрд┐рди MSVC 19.15.26730 рдиреЗ рдЦреБрдж рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ - рдЗрд╕рдиреЗ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ va_start рддрд░реНрдХ рдПрдХ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реЛрдирд╛ va_start ред

    MSVC рд╕реЗ рддреНрд░реБрдЯрд┐
     c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.15.26726\include\vadefs.h(151): error C2338: va_start argument must not have reference type and must not be parenthesized 

    рдЦреИрд░, рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк рджрд┐рдЦрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣
     void foo(int* n, ...) { va_list va; va_start(va, n); std::cout << va_arg(va, int) << std::endl; va_end(va); } 

  3. рдЯрд╛рдЗрдк va_arg рд▓рд┐рдП va_arg рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдирд╛ рдЧрд▓рдд рд╣реИ - char , short рдпрд╛ float ред

    рдЕрдорд╛рдиреНрдп рдХреЛрдб
     #include <cstdarg> #include <iostream> void foo(int n, ...) { va_list va; va_start(va, n); std::cout << va_arg(va, int) << std::endl; std::cout << va_arg(va, float) << std::endl; std::cout << va_arg(va, int) << std::endl; va_end(va); } int main() { foo(0, 1, 2.0f, 3); return 0; } 

    рдпрд╣ рдпрд╣рд╛рдБ рдФрд░ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╕рдВрдХрд▓рди рдкрд░ рдЬреАрд╕реАрд╕реА рдПрдХ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ рдХрд┐ float рдмрдЬрд╛рдп double рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рдХреЛрдб рдЕрднреА рднреА рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХ рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

    рдЬреАрд╕реАрд╕реА рдЪреЗрддрд╛рд╡рдиреА
     ./test.cpp:9:15: warning: 'float' is promoted to 'double' when passed through '...' std::cout << va_arg(va, float) << std::endl; ^~~~~~ ./test.cpp:9:15: note: (so you should pass 'double' not 'float' to 'va_arg') ./test.cpp:9:15: note: if this code is reached, the program will abort 

    рджрд░рдЕрд╕рд▓, рдПрдХ рдЕрд╡реИрдз рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд┐рдХрд╛рдпрдд рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
    рдПрдХ рдбрдВрдк рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдПрдХ рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖред рдФрд░ рдпрд╣ va_list рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рднреА рджрд░реНрд╢рд╛рддрд╛ рд╣реИред 32 рдмрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╣реИ

     va = 0xfffc6918 "" 

    рдпрд╛рдиреА va_list рд╕рд┐рд░реНрдл char* ред 64 рдмрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП:

     va = {{gp_offset = 16, fp_offset = 48, overflow_arg_area = 0x7ffef147e7e0, reg_save_area = 0x7ffef147e720}} 

    рдпрд╛рдиреА рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╣реА рдЬреЛ SystemV ABI AMD64 рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред

    рд╕рдВрдХрд▓рди рдореЗрдВ рдЕрд╡реНрдпрд╡рд╕реНрдерд╛ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЪреЗрддрд╛рд╡рдиреА рджреЗрддреА рд╣реИ рдФрд░ double рд╕рд╛рде float рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рднреА рд╕реБрдЭрд╛рд╡ рджреЗрддреА рд╣реИред

    рджрдмрдВрдЧ рдЪреЗрддрд╛рд╡рдиреА
     ./test.cpp:9:26: warning: second argument to 'va_arg' is of promotable type 'float'; this va_arg has undefined behavior because arguments will be promoted to 'double' [-Wvarargs] std::cout << va_arg(va, float) << std::endl; ^~~~~ 

    рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдм рдХреНрд░реИрд╢ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, 32-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:

     1 0 1073741824 

    64 рдмрд┐рдЯ:

     1 0 3 

    MSVC рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЪреЗрддрд╛рд╡рдиреА рдХреЗ рдмрд┐рдирд╛ /Wall ред

    рдпрд╣рд╛рдВ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ 32 рдФрд░ 64 рдмрд┐рдЯреНрд╕ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдмреАрдЖрдИ рд╕реНрдЯреИрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддрдерд╛рдХрдерд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ, рдкрд╣рд▓реЗ рдЪрд╛рд░ (рд╡рд┐рдВрдбреЛрдЬ) рдпрд╛ рдЫрд╣ (рд▓рд┐рдирдХреНрд╕) рдкреНрд░реЛрд╕реЗрд╕рд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ, рдмрд╛рдХреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдвреЗрд░ [ рд╡рд┐рдХреА ]ред рд▓реЗрдХрд┐рди рдирд╣реАрдВ, рдЕрдЧрд░ рдЖрдк foo рдХреЛ 4 рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ 19 рдХреЗ рд╕рд╛рде рдХрд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди рд╣реЛрдЧрд╛: 32-рдмрд┐рдЯ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдкреВрд░реНрдг рдЧрдбрд╝рдмрдбрд╝реА, рдФрд░ 64-рдмрд┐рдЯ рдПрдХ рдореЗрдВ рд╕рднреА float рд▓рд┐рдП рд╢реВрдиреНрдпред рдпрд╛рдиреА рдПрдмреАрдЖрдИ рдореЗрдВ рдмрд┐рдВрджреБ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣реИ, рд▓реЗрдХрд┐рди рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВред

    рдмреЗрд╢рдХ, рдРрд╕рд╛ рдХрд░рдирд╛ рд╕рд╣реА рд╣реИ
     void foo(int n, ...) { va_list va; va_start(va, n); std::cout << va_arg(va, int) << std::endl; std::cout << va_arg(va, double) << std::endl; std::cout << va_arg(va, int) << std::endl; va_end(va); } 

  4. рдЕрдирд╛рдо рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ nontrivial рдирд┐рд░реНрдорд╛рддрд╛ рдпрд╛ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЧрд▓рдд рд╣реИред рдЬрдм рддрдХ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕ рдХреЛрдб рдХрд╛ рднрд╛рдЧреНрдп рдЖрдкрдХреЛ рдХрдо рд╕реЗ рдХрдо "рд╕рдВрдХрд▓рди рдФрд░ рдпрд╣рд╛рдВ рдФрд░ рдЕрднреА рдЪрд▓рд╛рдиреЗ" рд╕реЗ рдЕрдзрд┐рдХ рдЙрддреНрддреЗрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред

    рдЕрдорд╛рдиреНрдп рдХреЛрдб
     #include <cstdarg> #include <iostream> struct Bar { Bar() { std::cout << "Bar default ctor" << std::endl; } Bar(const Bar&) { std::cout << "Bar copy ctor" << std::endl; } ~Bar() { std::cout << "Bar dtor" << std::endl; } }; struct Cafe { Cafe() { std::cout << "Cafe default ctor" << std::endl; } Cafe(const Cafe&) { std::cout << "Cafe copy ctor" << std::endl; } ~Cafe() { std::cout << "Cafe dtor" << std::endl; } }; void foo(int n, ...) { va_list va; va_start(va, n); std::cout << "Before va_arg" << std::endl; const auto b = va_arg(va, Bar); va_end(va); } int main() { Bar b; Cafe c; foo(1, b, c); return 0; } 

    рдХреНрд▓реИрдВрдЧ рд╕рдмрд╕реЗ рдЧрдВрднреАрд░ рд╣реИ рд╡рд╣ рдХреЗрд╡рд▓ рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рджреВрд╕рд░рд╛ рддрд░реНрдХ, va_arg POD рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ va_arg рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

    рджрдмрдВрдЧ рдЪреЗрддрд╛рд╡рдиреА
     ./test.cpp:23:31: error: second argument to 'va_arg' is of non-POD type 'Bar' [-Wnon-pod-varargs] const auto b = va_arg(va, Bar); ^~~ ./test.cpp:31:12: error: cannot pass object of non-trivial type 'Bar' through variadic function; call will abort at runtime [-Wnon-pod-varargs] foo(1, b, c); ^ 

    рддреЛ рдпрд╣ рд╣реЛрдЧрд╛, рдпрджрд┐ рдЖрдк рдЕрднреА рднреА -Wno-non-pod-varargs рдзреНрд╡рдЬ рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рди рдХрд░рддреЗ рд╣реИрдВред

    MSVC рдиреЗ рдЪреЗрддрд╛рд╡рдиреА рджреА рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЧреИрд░-рддреБрдЪреНрдЫ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреЛрд░реНрдЯреЗрдмрд▓ рдирд╣реАрдВ рд╣реИред

    MSVC рд╕реЗ рдЪреЗрддрд╛рд╡рдиреА
     d:\my documents\visual studio 2017\projects\test\test\main.cpp(31): warning C4840:    "Bar"          

    рд▓реЗрдХрд┐рди рдХреЛрдб рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

    рд▓реЙрдиреНрдЪ рдкрд░рд┐рдгрд╛рдо
     Bar default ctor Cafe default ctor Before va_arg Bar copy ctor Bar dtor Cafe dtor Bar dtor 

    рдпрд╛рдиреА va_arg рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдордп рд╣реА рдПрдХ рдХреЙрдкреА рдмрдирд╛рдИ va_arg , рдФрд░ рддрд░реНрдХ, рдпрд╣ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХрд┐рд╕реА рддрд░рд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рдирдХ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

    рдЬреАрд╕реАрд╕реА 6.3.0 рдПрдХ рднреА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд┐рдирд╛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЖрдЙрдЯрдкреБрдЯ рд╕рдорд╛рди рд╣реИ:

    рд▓реЙрдиреНрдЪ рдкрд░рд┐рдгрд╛рдо
     Bar default ctor Cafe default ctor Before va_arg Bar copy ctor Bar dtor Cafe dtor Bar dtor 

    7.3.0 gcc рднреА рдХреБрдЫ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪреЗрддрд╛рд╡рдиреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ:

    рд▓реЙрдиреНрдЪ рдкрд░рд┐рдгрд╛рдо
     Bar default ctor Cafe default ctor Cafe copy ctor Bar copy ctor Before va_arg Bar copy ctor Bar dtor Bar dtor Cafe dtor Cafe dtor Bar dtor 

    рдпрд╛рдиреА рд╕рдВрдХрд▓рдХ рдХрд╛ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдорд╛рди рд╕реЗ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ va_arg рдПрдХ рдФрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рддрд╛ рд╣реИред рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрд╝реЗрджрд╛рд░ рд╣реЛрдЧрд╛ рдЬрдм 6 рд╡реЗрдВ рд╕реЗ 7 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕реАрдПрдЪрд╕реА рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ / рд╡рд┐рдирд╛рд╢рдХреЛрдВ рдХреЗ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛрддреЗ рд╣реИрдВред

    рд╡реИрд╕реЗ, рдпрджрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ:

    рдПрдХ рдФрд░ рдЧрд▓рдд рдХреЛрдб
     void foo(int n, ...) { va_list va; va_start(va, n); std::cout << "Before va_arg" << std::endl; const auto& b = va_arg(va, Bar&); va_end(va); } int main() { Bar b; Cafe c; foo(1, std::ref(b), c); return 0; } 

    рддрдм рд╕рднреА рд╕рдВрдХрд▓рдХ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдВрдЧреЗред рдЬреИрд╕рд╛ рдХрд┐ рдорд╛рдирдХ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

    рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

    рдЗрд╕ рддрд░рд╣
     void foo(int n, ...) { va_list va; va_start(va, n); std::cout << "Before va_arg" << std::endl; const auto* b = va_arg(va, Bar*); va_end(va); } int main() { Bar b; Cafe c; foo(1, &b, &c); return 0; } 


рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рдФрд░ рдЪрд░ рдХрд╛рд░реНрдп


рдПрдХ рдУрд░, рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рдПрдХ рджреАрд░реНрдШрд╡реГрддреНрдд рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рди рдПрдХ рдирд┐рдпрдорд┐рдд рдирд╛рдо рдХреЗ рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рд╕реЗ рднреА рдмрджрддрд░ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдорд╛рдирдХ рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреАред

рдЕрдзрд┐рднрд╛рд░ рдЙрджрд╛рд╣рд░рдг
 #include <iostream> void foo(...) { std::cout << "C variadic function" << std::endl; } void foo(int) { std::cout << "Ordinary function" << std::endl; } int main() { foo(1); foo(1ul); foo(); return 0; } 


рд▓реЙрдиреНрдЪ рдкрд░рд┐рдгрд╛рдо
 $ ./test Ordinary function Ordinary function C variadic function 

рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рддрдм рддрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рддрд░реНрдХреЛрдВ рдХреЗ рдмрд┐рдирд╛ foo рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛред

рдмрд┐рдирд╛ рдмрд╣рд╕ рдХреЗ рдлреВрдХреЛ рдХреЛ рдмреБрд▓рд╛рдУ
 #include <iostream> void foo(...) { std::cout << "C variadic function" << std::endl; } void foo() { std::cout << "Ordinary function without arguments" << std::endl; } int main() { foo(1); foo(); return 0; } 

рд╕рдВрдХрд▓рдХ рдЙрддреНрдкрд╛рджрди
 ./test.cpp:16:9: error: call of overloaded 'foo()' is ambiguous foo(); ^ ./test.cpp:3:6: note: candidate: void foo(...) void foo(...) ^~~ ./test.cpp:8:6: note: candidate: void foo() void foo() ^~~ 

рд╕рдм рдХреБрдЫ рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣реИ: рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИрдВ - рджреАрд░реНрдШрд╡реГрддреНрдд рдХреЗ рд╕рд╛рде рдХреЛрдИ рддреБрд▓рдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЬрдм рдЕрдзрд┐рднрд╛рд░ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реИрд░рд┐рдПрдмрд▓ рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдмрджрддрд░ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред

рдЬрдм рдпрд╣ рдЪрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ


рдЦреИрд░, рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдХрд╛рд░реНрдп рдХрднреА-рдХрднреА рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реА ++ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рдЦрд░рд╛рдм рдкреЛрд░реНрдЯреЗрдмрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ тАЬрд╕реА рд╡реЗрд░рд┐рдПрдВрдЯ C рдлрдВрдХреНрд╢рдиреНрд╕ рди рдмрдирд╛рдПрдВ рдпрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рди рдХрд░реЗрдВтАЭ рдЬреИрд╕реЗ рдХрдИ рдЯрд┐рдкреНрд╕ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ C ++ рд╕реНрдЯреИрдВрдбрд░реНрдб рд╕реЗ рдЕрдкрдирд╛ рд╕рдкреЛрд░реНрдЯ рдирд╣реАрдВ рд╣рдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред рддреЛ рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд╛рдн рд╣реИ? рдЦреИрд░ рд╡рд╣рд╛рдБред

  • рд╕рдмрд╕реЗ рдЖрдо рдФрд░ рд╕реНрдкрд╖реНрдЯ рдорд╛рдорд▓рд╛ рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдореИрдВ рддреГрддреАрдп-рдкрдХреНрд╖ рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ (рдЬреЗрдПрдирдЖрдИ рдХреЗ рд╕рд╛рде рдореЗрд░рд╛ рдорд╛рдорд▓рд╛) рдФрд░ рд╕реА рдПрдкреАрдЖрдИ рдХреЗ рд╕реА ++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкреНрд░рд╛рд╡рдзрд╛рди рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред
  • SFINAE ред рдпрд╣рд╛рдВ, рдпрд╣ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ C ++ рдореЗрдВ рдПрдХ рдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ рдЬрдм рдУрд╡рд░рд▓реЛрдб рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдПрдХ рдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдВрддрд┐рдо рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрджрд┐ рдХрдо рд╕реЗ рдХрдо рдПрдХ рддрд░реНрдХ рд╣реИ)ред рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣, рдПрдХ рдЪрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА рднреА рдХреЙрд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    рдЙрджрд╛рд╣рд░рдг
     template <class T> struct HasFoo { private: template <class U, class = decltype(std::declval<U>().foo())> static void detect(const U&); static int detect(...); public: static constexpr bool value = std::is_same<void, decltype(detect(std::declval<T>()))>::value; }; 

    рд╣рд╛рд▓рд╛рдВрдХрд┐ C ++ 14 рдореЗрдВ рдЖрдк рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

    рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг
     template <class T> struct HasFoo { private: template <class U, class = decltype(std::declval<U>().foo())> static constexpr bool detect(const U*) { return true; } template <class U> static constexpr bool detect(...) { return false; } public: static constexpr bool value = detect<T>(nullptr); }; 

    рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рддрд░реНрдХ рдХрд╛ detect(...) рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ detect(...) рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЪрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзреБрдирд┐рдХ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛, рдЙрдирдХреА рд╕рднреА рдХрдорд┐рдпреЛрдВ рд╕реЗ рд░рд╣рд┐рддред

рд╡реЗрд░рд┐рдПрдВрдЯ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдпрд╛ рдЖрдзреБрдирд┐рдХ C ++ рдореЗрдВ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП


рдЪрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдбрдЧрд▓рд╕ рдЧреНрд░реЗрдЧрд░, рдЬрд╛рдХреЛ рдЬреЗрд░реНрд╡реА рдФрд░ рдЧреИрд░реА рдкреЙрд╡реЗрд▓ рджреНрд╡рд╛рд░рд╛ 2004 рдореЗрдВ рд╡рд╛рдкрд╕ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЕрд░реНрдерд╛рддреНред рд╕реА ++ 11 рдорд╛рдирдХ рдХреЛ рдЕрдкрдирд╛рдиреЗ рд╕реЗ 7 рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдЬрд┐рд╕рдореЗрдВ рдЗрди рдЪрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛редрдорд╛рдирдХ рдореЗрдВ рдЙрдирдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдПрдХ рддреАрд╕рд░рд╛ рд╕рдВрд╢реЛрдзрди рд╢рд╛рдорд┐рд▓ рдерд╛, N2080 ред

рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА, рд╡реИрд░рд┐рдПрдмрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдмрдирд╛рдП рдЧрдП рдереЗ рддрд╛рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд▓реЗ рддрд░реНрдХреЛрдВ рд╕реЗ рдЯрд╛рдЗрдк-рд╕реЗрдл (рдФрд░ рдкреЛрд░реНрдЯреЗрдмрд▓!) рдлрдВрдХреНрд╢рдиреНрд╕ рдмрдирд╛рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдорд┐рд▓реЗред рдПрдХ рдЕрдиреНрдп рд▓рдХреНрд╖реНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рдЪрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рд╡рд░реНрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдХреЗрд╡рд▓ рдЪрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд╡реИрд░рд┐рдПрдмрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рддреАрди рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ C ++ [C ++ 17 17.5.3] рдкрд░ рд▓реЗ рдЖрдП :

  • рдЦрд╛рдХрд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдкреИрдХреЗрдЬ ( рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХ ) - рдЬреЛ рдХреЗ рдмрдЬрд╛рдп рдпрд╣ рдХрд┐рд╕реА рднреА (0 рд╕рд╣рд┐рдд) рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИ,;
  • рдлрдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХрд╛ рдПрдХ рдкреИрдХреЗрдЬ ( рдлрдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХ ) - рддрджрдиреБрд╕рд╛рд░, рдпрд╣ рдПрдХ рдлрдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (0 рд╕рд╣рд┐рдд) рд▓реЗрддрд╛ рд╣реИ;
  • рдФрд░ рдкреИрдХреЗрдЬ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ ( рдкреИрдХ рд╡рд┐рд╕реНрддрд╛рд░ ) рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╣реИ рдЬреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг
 template <class ... Args> void foo(const std::string& format, Args ... args) { printf(format.c_str(), args...); } 

рдпрд╣рд╛рдБ class ... ArgsрдЯреЗрдореНрдкрд▓реЗрдЯ рдорд╛рдкрджрдВрдбреЛрдВ Args ... argsрдХрд╛ рдПрдХ рдкреИрдХреЗрдЬ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рдкреИрдХреЗрдЬ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ args...рдХреЗ рдПрдХ рдкреИрдХреЗрдЬ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИред

рдорд╛рдирдХ рдкреИрдХреЗрдЬ рдХрд╣рд╛рдБ рдФрд░ рдХреИрд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕рдХреА рдкреВрд░реА рд╕реВрдЪреА рдорд╛рдирдХ рдореЗрдВ рд╣реА рджреА рдЧрдИ рд╣реИ [C ++ 17 17.5.3 / 4] ред рдФрд░ рдЪрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╣ рдХрд╣рдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐:

  • рдлрд╝рдВрдХреНрд╢рди рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬ рдХреЛ рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░реНрдХ рд╕реВрдЪреА рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
     template <class ... Args> void bar(const std::string& format, Args ... args) { foo<Args...>(format.c_str(), args...); } 

  • рдпрд╛ рдЖрд░рдВрднреАрдХрд░рдг рд╕реВрдЪреА рдореЗрдВ
     template <class ... Args> void foo(const std::string& format, Args ... args) { const auto list = {args...}; } 

  • рдпрд╛ рд▓реИрдВрдмрдбрд╛ рдХреИрдкреНрдЪрд░ рд╕реВрдЪреА рдореЗрдВ
     template <class ... Args> void foo(const std::string& format, Args ... args) { auto lambda = [&format, args...] () { printf(format.c_str(), args...); }; lambda(); } 

  • рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рдФрд░ рдкреИрдХреЗрдЬ рдПрдХ рдХрдирд╡рд▓реНрд╢рди рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
     template <class ... Args> int foo(Args ... args) { return (0 + ... + args); } 

    рд╡рд╛рд░реНрддрд╛рд▓рд╛рдк C ++ 14 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдП рдФрд░ рд╡реЗ рджрд╛рдПрдВ рдФрд░ рдмрд╛рдПрдВ рдПрдХрд╛рддреНрдордХ рдФрд░ рдмрд╛рдЗрдирд░реА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдорд╛рдирдХ [C ++ 17 8.1.6] рдореЗрдВ рд╣реИ ред
  • рджреЛрдиреЛрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рдЖрдХрд╛рд░ ... рдСрдкрд░реЗрдЯрд░ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
     template <class ... Args> void foo(Args ... args) { const auto size1 = sizeof...(Args); const auto size2 = sizeof...(args); } 


рд╕реНрдкрд╖реНрдЯ рдЕрдВрдбрд╛рдХрд╛рд░ рдкреИрдХреЗрдЬ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ (рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреА рдЬрд░реВрд░рдд рд╣реИ рдкреИрдЯрд░реНрди ) рдкреНрд░рдХрдЯреАрдХрд░рдг рдФрд░ рдЗрд╕ рдЕрд╕реНрдкрд╖реНрдЯрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
 template <class ... Args> void foo() { using OneTuple = std::tuple<std::tuple<Args>...>; using NestTuple = std::tuple<std::tuple<Args...>>; } 

OneTuple тАФ ( std:tuple<std::tuple<int>>, std::tuple<double>> ), NestTuple тАФ , тАФ ( std::tuple<std::tuple<int, double>> ).

рд╡реЗрд░рд┐рдПрдмрд▓ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд┐рдВрдЯрдлрд╝ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╕реА рдХреЗ рдЪрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдзреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рдП рдЧрдП рдереЗред рдЗрди рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓реЗрдЦрдХреЛрдВ рдиреЗ рд╕реНрд╡рдпрдВ рдЕрдкрдиреЗ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ рдерд╛ printf- рд╕реА рдореЗрдВ рдкрд╣рд▓реЗ рдЪрд░ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХред

рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдкрд░ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ
 void printf(const char* s) { while (*s) { if (*s == '%' && *++s != '%') throw std::runtime_error("invalid format string: missing arguments"); std::cout << *s++; } } template <typename T, typename ... Args> void printf(const char* s, T value, Args ... args) { while (*s) { if (*s == '%' && *++s != '%') { std::cout << value; return printf(++s, args...); } std::cout << *s++; } throw std::runtime_error("extra arguments provided to printf"); } 

рдореБрдЭреЗ рд╕рдВрджреЗрд╣ рд╣реИ, рддреЛ рдЪрд░ рддрд░реНрдХреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд╛ рдпрд╣ рдкреИрдЯрд░реНрди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ - рдЕрддрд┐рднрд╛рд░рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдХреЙрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдХрд▓реНрдк рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред

рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдкрд░ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рд┐рдВрдЯ
 template <typename ... Args> void printf(const std::string& fmt, const Args& ... args) { size_t fmtIndex = 0; size_t placeHolders = 0; auto printFmt = [&fmt, &fmtIndex, &placeHolders]() { for (; fmtIndex < fmt.size(); ++fmtIndex) { if (fmt[fmtIndex] != '%') std::cout << fmt[fmtIndex]; else if (++fmtIndex < fmt.size()) { if (fmt[fmtIndex] == '%') std::cout << '%'; else { ++fmtIndex; ++placeHolders; break; } } } }; ((printFmt(), std::cout << args), ..., (printFmt())); if (placeHolders < sizeof...(args)) throw std::runtime_error("extra arguments provided to printf"); if (placeHolders > sizeof...(args)) throw std::runtime_error("invalid format string: missing arguments"); } 

рдЕрдзрд┐рднрд╛рд░ рд╕рдВрдХрд▓реНрдк рдФрд░ рдЪрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛рд░реНрдп


рдЬрдм рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрди рд╡реИрд░рд┐рдПрдмрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рдмрд╛рдж, рдорд╛рдирдХ рдФрд░ рд╕рдмрд╕реЗ рдХрдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдмрд┐рдирд╛ рдмрд╣рд╕ рдХреЗ рдХреЙрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

рдЕрдзрд┐рднрд╛рд░ рдЙрджрд╛рд╣рд░рдг
 #include <iostream> void foo(int) { std::cout << "Ordinary function" << std::endl; } void foo() { std::cout << "Ordinary function without arguments" << std::endl; } template <class T> void foo(T) { std::cout << "Template function" << std::endl; } template <class ... Args> void foo(Args ...) { std::cout << "Template variadic function" << std::endl; } int main() { foo(1); foo(); foo(2.0); foo(1, 2); return 0; } 

рд▓реЙрдиреНрдЪ рдкрд░рд┐рдгрд╛рдо
 $ ./test Ordinary function Ordinary function without arguments Template function Template variadic function 

рдЬрдм рдЕрдзрд┐рднрд╛рд░ рд╣рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЪрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдПрдХ рдЪрд░ рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреНрдпреЛрдВ рдорд┐рд▓рд╛рдПрдВ?)ред рд╕рд┐рд╡рд╛рдп - рдмреЗрд╢рдХ! - рдмрд┐рдирд╛ рдмрд╣рд╕ рдХреЗ рдмреБрд▓рд╛рд╡рд╛ред

рдмрд┐рдирд╛ рдмрд╣рд╕ рдХреЗ рдмреБрд▓рд╛рдУ
 #include <iostream> void foo(...) { std::cout << "C variadic function" << std::endl; } template <class ... Args> void foo(Args ...) { std::cout << "Template variadic function" << std::endl; } int main() { foo(1); foo(); return 0; } 

рд▓реЙрдиреНрдЪ рдкрд░рд┐рдгрд╛рдо
 $ ./test Template variadic function C variadic function 

рдПрдХ рджреАрд░реНрдШрд╡реГрддреНрдд рдХреЗ рд╕рд╛рде рдПрдХ рддреБрд▓рдирд╛ рд╣реИ - рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди рд╣рд╛рд░рддрд╛ рд╣реИ, рдПрдХ рджреАрд░реНрдШрд╡реГрддреНрдд рдХреЗ рд╕рд╛рде рдХреЛрдИ рддреБрд▓рдирд╛ рдирд╣реАрдВ рд╣реИ - рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдЧреИрд░-рдЯреЗрдореНрдкрд▓реЗрдЯ рдПрдХ рд╕реЗ рдЕрд╡рд░ рд╣реИред

рдЪрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдЧрддрд┐ рдкрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдиреЛрдЯ


2008 рдореЗрдВ, Lo submittedc Joly рдиреЗ C ++ рдорд╛рдирдХреАрдХрд░рдг рд╕рдорд┐рддрд┐ рдХреЛ рдЕрдкрдирд╛ рдкреНрд░рд╕реНрддрд╛рд╡ N2772 рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ , рдЬрд┐рд╕рдореЗрдВ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдЪрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рд╕рдорд╛рди рдХрд╛рд░реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рддрд░реНрдХ рдЖрд░рдВрднреАрдХрд░рдг рд╕реВрдЪреА ( std::initializer_list) рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рдЗрд╕рдиреЗ рд╕реНрд╡рдпрдВ рд▓реЗрдЦрдХ рдХреЗ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдФрдЪрд┐рддреНрдп рдХрд╛ рдЦрдВрдбрди рдХрд┐рдпрд╛, рдЬреЛрд▓реА рдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ std::min, std::maxрдФрд░ std::minmaxрдареАрдХ рд╕реЗ рдЖрд░рдВрднреАрдХрд░рдг рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рдорджрдж рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рди рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд╕рд╛рдеред

рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 2009 рдореЗрдВ, рдПрдХ рдЦрдВрдбрди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдЬреЛрд▓реА рдХреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ, рдПрдХ "рдЧрдВрднреАрд░ рдЧрд▓рддреА" рдХреА рдЦреЛрдЬ рдХреА рдЧрдИ рдереА (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЦреБрдж рдХреЛ рднреА)ред рдирдП рдкрд░реАрдХреНрд╖рдг ( рдпрд╣рд╛рдВ рдФрд░ рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ)) рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЪрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЕрднреА рднреА рддреЗрдЬрд╝ рд╣реИрдВ, рдФрд░ рдХрднреА-рдХрднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд░реВрдк рд╕реЗред рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕реЗ рдЖрд╢реНрдЪрд░реНрдп рдирд╣реАрдВ рд╣реИ рдЖрд░рдВрднреАрдХрд░рдг рд╕реВрдЪреА рдЗрд╕рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ рдмрдирд╛рддреА рд╣реИ, рдФрд░ рдЪрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдЧрд┐рди рд╕рдХрддреЗ рд╣реИрдВред

рдлрд┐рд░ рднреА, C ++ 11 рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рдХреЗ рдорд╛рдирдХреЛрдВ std::min, std::maxрдФрд░ std::minmaxрд╕рд╛рдзрд╛рд░рдг рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВ, рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддрд░реНрдХ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рд╛рд░рд╛рдВрд╢ рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖


рддреЛ, рд╕реА-рд╕реНрдЯрд╛рдЗрд▓ рдЪрд░ рдХрд╛рд░реНрдп:

  • рдЙрдиреНрд╣реЗрдВ рдпрд╛ рддреЛ рдЙрдирдХреЗ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИред рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдмрд╛рдХреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдЕрд╡реИрдз рд░реВрдк рд╕реЗ рдЕрдирд╛рдо рддрд░реНрдХ (рдФрд░ рдЕрдВрддрд┐рдо рдирд╛рдо) рдХреЗ рдкреНрд░рдХрд╛рд░ рдЙрдард╛рдПрдВред рдпрджрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрд╕реНрдкрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдорд┐рд▓рддрд╛ рд╣реИред
  • рд╡реЗ рд╢реБрджреНрдз рд╕реА рдХреЗ рд╕рд╛рде рдкрд┐рдЫрдбрд╝реА рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
  • C ++ 11 рд╕реЗ рдкрд╣рд▓реЗ, POD рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рддрд░реНрдХ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ , рдФрд░ C ++ 11 рдХреЗ рдмрд╛рдж рд╕реЗ, рдЧреИрд░-рддреБрдЪреНрдЫ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╕рдВрдХрд▓рдХ рдХреЗ рд╡рд┐рд╡реЗрдХ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╛рдиреА рдХреЛрдб рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрдВрдкрд╛рдЗрд▓рд░ рдФрд░ рдЙрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рдЪрд░ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЕрдиреБрдореЗрдп рдЙрдкрдпреЛрдЧ C ++ рдХреЛрдб рдореЗрдВ C API рдХреЗ рд╕рд╛рде рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рдирд╛ рд╣реИред SFINAE рд╕рд╣рд┐рдд рдЕрдиреНрдп рд╕рднреА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд▓рд┐рдП, рдЪрд░ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВ:

  • рдЙрдирдХреЗ рд╕рднреА рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЬрд╛рдиреЗрдВред
  • рд╕реБрд░рдХреНрд╖рд┐рдд рдЯрд╛рдЗрдк рдХрд░реЗрдВ, рдЙрдирдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рди рдмрджрд▓реЗрдВред
  • рд╡реЗ рдХрд┐рд╕реА рднреА рд░реВрдк рдореЗрдВ рдЧреБрдЬрд░рддреА рддрд░реНрдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ - рдореВрд▓реНрдп рджреНрд╡рд╛рд░рд╛, рд╕реВрдЪрдХ рджреНрд╡рд╛рд░рд╛, рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛, рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ред
  • рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рд╕реА ++ рдлрд╝рдВрдХреНрд╢рди рдХреА рддрд░рд╣, рддрд░реНрдХреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХреЛрдИ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд╣реИред
  • ( C ), .

рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдЙрдирдХреЗ рд╕реА-рд╕реНрдЯрд╛рдЗрд▓ рд╕рдордХрдХреНрд╖реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрднреА-рдХрднреА рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрддрд┐рднрд╛рд░рд┐рдд рдЧреИрд░-рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╕рдВрд╕реНрдХрд░рдг (рдкреБрдирд░рд╛рд╡рд░реНрддреА рддрд░реНрдХ рдЯреНрд░реИрд╡рд░реНрд╕рд▓) рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╡реЗ рдкрдврд╝рдирд╛ рдФрд░ рд▓рд┐рдЦрдирд╛ рдХрдард┐рди рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдм рд╕реВрдЪреАрдмрджреНрдз рдХрдорд┐рдпреЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рд╕реВрдЪреАрдмрджреНрдз рд▓рд╛рднреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рднреБрдЧрддрд╛рди рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╣реИред

рдареАрдХ рд╣реИ, рдирд┐рд╖реНрдХрд░реНрд╖ рд╕рд░рд▓ рд╣реИ: рд╕реА рд╢реИрд▓реА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рдХрд╛рд░реНрдп рд╕реА ++ рдореЗрдВ рдХреЗрд╡рд▓ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреЗ рдХрд╛рд░рдг рдмрдиреЗ рд░рд╣рддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдЖрдкрдХреЗ рдкреИрд░ рдХреЛ рд╢реВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред рдЖрдзреБрдирд┐рдХ рд╕реА ++ рдореЗрдВ, рдпрд╣ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдирдП рдХреЛ рди рд▓рд┐рдЦреЗрдВ рдФрд░, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ, рдореМрдЬреВрджрд╛ рдЪрд░ рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рдЪрд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдЖрдзреБрдирд┐рдХ C ++ рдХреА рджреБрдирд┐рдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рд╕рд╛рд╣рд┐рддреНрдп рдФрд░ рд╕реНрд░реЛрдд



рдкреБрдирд╢реНрдЪ


рдиреЗрдЯ рдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХреЛрдВ рдХреЗ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЦреЛрдЬрдирд╛ рдФрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдиреВрдиреА рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд▓рд┐рдВрдХ рдирд╣реАрдВ рджреЗрддрд╛ред

Source: https://habr.com/ru/post/hi430064/


All Articles