GoingNative 2012 рд╕рдореНрдореЗрд▓рди рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП (рдЬреЛ рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рд╕рднреА C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ), рдореИрдВрдиреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛:

#include <iostream> struct S { int n; }; struct X { X(int) {} }; void f(void*) { std::cerr << "Pointer!\n"; } void f(X) { std::cerr << "X! \n"; } int main() { f(S().n); }
рдХреНрдпрд╛ рдЖрдк рдмрд┐рдирд╛ рдкреАрдЫреЗ рджреЗрдЦреЗ, рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреНрдпрд╛ рдЫрд╛рдкреЗрдЧрд╛ рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ
рдХрд┐ рдХреНрдпреЛрдВ ?
рдХрдЯ рдХреЗ рддрд╣рдд, Google рдХреЗ
рдХреНрд▓реИрдВрдЧ рдбреЗрд╡рд▓рдкрд░ рдХрд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдХреНрдпреЛрдВ рдпрд╣ рдХреЛрдб рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдЗрд╕реЗ рдХрд┐рд╕рдиреЗ рдкрдХрдбрд╝рд╛: Google
рдХреЗ C ++ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ
рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЙрд╕рдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдзрд╛рд░рдгрд╛ рд╣реИред
рдЬрд╡рд╛рдм рд╣реИ
рдЬрдм C ++ 98 рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЛрдб "
X! " рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛, рдЬрдм C ++ 98 рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рддреЛ рдпрд╣ рдХреЛрдб "
Pointer! " рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдЧрд╛ред
C ++ 11 рдорд╛рдирдХ рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢реНрди

рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг
рдЖрдЗрдП рд░реЗрдЦрд╛ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВ
f(S().n);
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдПрд╕ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (
рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╕реНрдерд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ ) рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЙрдиреНрдирдд рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде C ++ 11 рдорд╛рдирдХ рдЖрддрд╛ рд╣реИред C ++ 11 рдореЗрдВ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди (рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рд╕рд╣рд┐рдд) рдХреЛ рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
int get_five() {return 5;} int some_value[get_five() + 7];
рд▓рдЧрд╛рддрд╛рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░рдгреА рдШреЛрд╖рдгрд╛рдУрдВ рдореЗрдВ, рдПрдирдо рдореЗрдВ, рд╕реНрд╡рд┐рдЪ \ рдХреЗрд╕ рдмреНрд▓реЙрдХ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ C ++ 11 рд╕рдВрдХрд▓рдХ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрди рд╕рднреА рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░, рд╕реНрдерд┐рд░ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдВрд░рдЪрдирд╛
рдПрд╕ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдареАрдХ рд╣реИ, рдЕрдЧрд░ рд╡рд╣ рд╣рдореЗрд╢рд╛ рдЪрд░
n (рдФрд░ рдорд╛рдирдХ рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдирд╣реАрдВ рд▓рдЧрд╛рддрд╛ рд╣реИ) рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рднреА рд╣реЛ рд╕рдХрддреА рд╣реИред рдФрд░ рд╡рд╣ рд╣рд░ рдмрд╛рд░
n рдЕрд▓рдЧ-рдЕрд▓рдЧ рдорд╛рди рдХреНрдпреЛрдВ рджреЗрдЧрд╛? рд╢реВрдиреНрдп рд╕реМрдВрдкрддрд╛ рд╣реИред рдмрд┐рд▓реНрдХреБрд▓ рд╢реВрдиреНрдп рдХреНрдпреЛрдВ? рдХреНрдпрд╛ рдЖрдкрдХреЗ рдорди рдореЗрдВ рдХреЛрдИ рдмреЗрд╣рддрд░ рдЕрд░реНрде рд╣реИ?
рддреЛ, рдЙрдкрд░реЛрдХреНрдд рдкрдВрдХреНрддрд┐ рд╕рдорддреБрд▓реНрдп рд╣реИ:
f(0);
рдареАрдХ рд╣реИ, рдпрд╣, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорддреБрд▓реНрдп рд╣реИ:
f(NULL);
рдФрд░ рдпрд╣
рдПрдХреНрд╕ (
рд╕реНрдЯреНрд░рдХреНрдЪрд░рд▓ рдПрдХреНрд╕ (рдЗрдВрдЯ) рдХреЗ рд╕рд╛рде рднреА)
рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдПрдХреНрд╕ рдХреЗ рдмрдЬрд╛рдп
* рд╢реВрдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдкрд╖реНрдЯ рдХреЙрд▓
void f (void *) рд╣реИ ! рдЦреИрд░, рдпрд╣ "
рдкреЙрдЗрдВрдЯрд░! " рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред
C ++ 98 рд╕рдорд░реНрдерди рд╡рд╛рд▓реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рдРрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ? рд╣рд╛рдВ, рдХреНрдпреЛрдВрдХрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмрд╣реБрдд рдЙрдиреНрдирдд рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред рд╕рдВрд░рдЪрдирд╛
рдПрд╕ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рд╢реВрдиреНрдп рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИ (рдорд╛рдирдХ рдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдЦреИрд░, рд╡рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рддреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ
рдПрдл (рдПрд╕ (рдПрди) рдПрди); рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ
f (0) рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
; рд╕рднреА рдЖрдЧрд╛рдореА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рдеред
рдирд┐рд╖реНрдХрд░реНрд╖
рд╕реА ++ 11 рдорд╛рдирдХ рдирдпрд╛ рд╣реИ, рд╕рдВрдХрд▓рдХ рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рднреА рдХрдЪреНрдЪрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд░рд╣реЗрдВред