рдпрджрд┐ рдЖрдк рд╕реНрдкрд╖реНрдЯ рдХреАрд╡рд░реНрдб рдХреЗ рдЕрд░реНрде рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд╕реЗ рдкреВрдЫрддреЗ рд╣реИрдВ, рддреЛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛ рдЙрддреНрддрд░ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХреАрд╡рд░реНрдб рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ (рдпрд╛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдШреЛрд╖рдгрд╛ рд╕реЗ рдкрд╣рд▓реЗ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░, рджреВрд╕рд░реЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ) рдФрд░ рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рдХреЛ рд░реЛрдХрддрд╛ рд╣реИ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдкреНрд░рдХрд╛рд░ред
class Simple { public: Simple(int a) : a_(a) {} private: int a_; }; class SimpleExplicit { public: explicit SimpleExplicit(int a) : a_(a) {} private: int a_; }; template <typename S> void someFunc(const S& s) { } int main(int, char**) { Simple s3 = 11; // SimpleExplicit se3 = 11; - COMPILE ERROR SimpleExplicit se3 = SimpleExplicit(11); someFunc<Simple>(11); // someFunc<SimpleExplicit>(11); - COMPILE ERROR someFunc<SimpleExplicit>(SimpleExplicit(11)); return 0; }
рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ C ++ 03 рдореЗрдВ, рдХреАрд╡рд░реНрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░рд┐рджреГрд╢реНрдп рд╡рд╣рд╛рдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, C ++ 11 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рд╕реНрдкрд╖реНрдЯ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢: рдЕрдм рдпрд╣ рди рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдореЗрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рди рдХреЗрд╡рд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдореЗрдВ рднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
2011 рдореЗрдВ, рд╕реНрдЯреИрдВрдбрд░реНрдб рдХреЛ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ C рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдЪреАрдЬрд╝реЛрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рдЪрд┐рдбрд╝рд┐рдпрд╛рдШрд░ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╕реА рд╕реЗ рд╕рд╛рдлрд╝ рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВ рдпрд╣рд╛рдБ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛, рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдХрдИ рд╡рд┐рд╕реНрддреГрдд рд▓реЗрдЦ рд╣реИрдВ, рдЙрдирдХреЗ рдХреАрд╡рд░реНрдб рджреНрд╡рд╛рд░рд╛ рдЦреЛрдЬрдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╡рд┐рд╕реНрддрд╛рд░ рддрдерд╛рдХрдерд┐рдд рд╣реИ рд╕реА рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рдХреБрд▓ рдЖрд░рдВрднред
рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдЖрд░рдВрдн рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, 0.2.3 рдпрд╛ рдЕрдзрд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖрдпрд╛:
class Simple { public: Simple() : a_(0), b_(0) {} Simple(int a) : a_(a), b_(0) {} Simple(int a, int b) : a_(a), b_(b) {} private: int a_, b_; }; class SimpleExplicit { public: explicit SimpleExplicit() : a_(0), b_(0) {} explicit SimpleExplicit(int a) : a_(a), b_(0) {} explicit SimpleExplicit(int a, int b) : a_(a), b_(b) {} private: int a_, b_; }; template <typename S> void someFunc(const S& s) { } int main(int, char**) { Simple s4 = {}; someFunc<Simple>({}); // SimpleExplicit se4 = {}; - COMPILE ERROR SimpleExplicit se4 = SimpleExplicit{}; // someFunc<SimpleExplicit>({}); - COMPILE ERROR someFunc<SimpleExplicit>(SimpleExplicit{}); Simple s5 = {11}; someFunc<Simple>({11}); // SimpleExplicit se5 = {11}; - COMPILE ERROR SimpleExplicit se5 = SimpleExplicit{11}; // someFunc<SimpleExplicit>({11}); - COMPILE ERROR someFunc<SimpleExplicit>(SimpleExplicit{11}); Simple s6 = {11, 22}; someFunc<Simple>({11, 22}); // SimpleExplicit se6 = {11, 22}; - COMPILE ERROR SimpleExplicit se6 = SimpleExplicit{11, 22}; // someFunc<SimpleExplicit>({11, 22}); - COMPILE ERROR someFunc<SimpleExplicit>(SimpleExplicit{11, 22}); return 0; }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, C ++ 11 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рд╕реНрдкрд╖реНрдЯ рдХреАрд╡рд░реНрдб рдХреЛ рд░реВрдкрд╛рдВрддрд░рдг рдСрдкрд░реЗрдЯрд░реЛрдВ рдкрд░ рднреА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЙрдирдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрд╣реНрд╡рд╛рди рдХреЛ рднреА рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ:
class Simple { public: Simple() {} operator bool() const { return true; } }; class SimpleExplicit { public: explicit SimpleExplicit() {} explicit operator bool() const { return true; } }; int main(int, char**) { Simple s7{}; bool b7 = s7; SimpleExplicit se7{}; // bool be7 = se7; - COMPILE ERROR bool be7 = static_cast<bool>(se7); return 0; }
рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдХрд┐рд╕реА рднреА рдирдП C ++ рдХреЛрдб рдореЗрдВ рдпреВрдирд┐рд╡рд░реНрд╕рд▓ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рд╕рд╛рде рд╣реА рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХреЛ рд╣рдореЗрд╢рд╛ рдШреЛрд╖рд┐рдд рдХрд░реВрдВрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ рдирд┐рд╣рд┐рдд рд░реВрдкрд╛рдВрддрд░рдг рд╢рдмреНрджрд╛рд░реНрде рд░реВрдк рд╕реЗ рдЙрдЪрд┐рдд рди рд╣реЛред