ãã®èšäºã§ã¯ãVisual Studio 2012ã§å©çšå¯èœã§Visual Studio 2013ã§ä¿®æ£ãããC ++ 11æšæºã®å®è£ ã«ãããå€ãã®ãã°ã«ã€ããŠèª¬æããŸãããããã£ãŠãçè«äžäœ¿çšãããã¯ãã®C ++ 11ã䜿çšã§ããããã«ãªããŸããã VS2012ã®ãã°ãåé¿ããããã«ãã¯ã©ã³ãããäœæããå¿ èŠããã£ãå Žåã¯ãããããåé€ã§ããŸãã
æ®å¿µãªããããã¹ãŠã®ãã°ãä¿®æ£ãããããã§ã¯ãªããVS2012ããVS2013ã«äœãã移è¡ããæ°ãããã°ãçºçããŸããã ã«ããã®äžã«ãçŸåšã®ç¶æ³ã®è©³çŽ°ãªåæããããŸãã
å¯å€é·ãã³ãã¬ãŒãã®åã®æ°ã«å¶éããªããªããŸãã
Visual Studio 2013ã¯å¯å€é·ãã³ãã¬ãŒããå®å šã«ãµããŒãããŠãããstd :: functionãmake_sharedãªã©ã®åŒæ°ã®æ°ã«å¶éããªããªããŸããã Visual Studio 2012ã§ã¯ããã®å¶éãååšãã5ïŒ5ïŒã§ããã
åæšè«ã«é¢ãããã°ãä¿®æ£
èªå倱ãããã¢ã©ã€ã¡ã³ãæå®å
autoã䜿çšããŠåŒ__declspecïŒalignïŒ...ïŒïŒã§å®çŸ©ãããåã®å€æ°ã宣èšããå ŽåãVS2012ã§alignã誀ã£ãŠåŠçãããäžé©åãªã¡ã¢ãªãã±ãŒã·ã§ã³ãšã©ã³ãã ã¯ã©ãã·ã¥ãçºçããŸããããã¹ãŠã®ã±ãŒã¹ã§ãã¿ã€ãã®ä»£ããã«decltypeã䜿çšã§ããŸããã§ãã
decltypeãä»ããŠå®çŸ©ãããåã¯ãéåžžã®åã䜿çšã§ããå Žæãªãã©ãã§ã䜿çšã§ããã¯ãã§ãããšããäºå®ã«ãããããããVS2012ã§ã¯ãããšãã°æ¬¡ã®ãããªã³ãŒãã®èšè¿°ãèš±å¯ãããŠããŸãããvector<int> a; decltype(a)::iterator iter = a.end(); // VS2012
declvalã¯ã³ã³ãã€ã«ãšã©ãŒãåŒãèµ·ãããŸãã
C ++ 11æšæºã«æºæ ããäžéšã®æ£ããã³ãŒãã¯ãdeclvalã®èª€ã£ã解éã®ããã«VS2012ã§ã³ã³ãã€ã«ãããŸããã§ãããis_comparableãã¿ãŒã³ã宣èšãããšããŸãïŒ
template<typename, typename = true_type> struct is_comparable : public false_type {}; template<typenameT> struct is_comparable<T, typename is_convertible<decltype(declval<T>() > declval<T>()), bool>::type> : public true_type {};
declvalã¯Tãäœã§ããããç解ããªããããããã¯VS2012ã§ã¯æ©èœããŸããã
ã¹ããŒããã€ã³ã¿ãŒã®ãã°ãä¿®æ£
ã©ã ãé¢æ°ãã«ã¹ã¿ã åé€æ©èœãšããŠäœ¿çšãããšãboolåãžã®å€æãäžæãããŸãã
ã©ã ãé¢æ°ã䜿çšããŠã¹ããŒããã€ã³ã¿ãŒãåé€ãããšãã«äœãèµ·ãããã決å®ããå Žåããã®ãã€ã³ã¿ãŒãããŒã«åã«å€æããã³ã³ããã¹ãã§äœ¿çšããããšã¯ã§ããŸããã auto stream_deleter = [](ofstream* os) { os->close(); }; unique_ptr<ofstream, decltype(stream_deleter)> p_log(&log_file, stream_deleter); if (!p_log) // compile error cout << "Couldn't open file" << endl;
unique_ptr ::ãªã»ãããåŒã³åºããšãäºéã«åé€ãããå¯èœæ§ããããŸã
ãªã»ããæ¹æ³ã®æäœã®é åºã¯ãæšæºã§èšè¿°ãããŠããé åºãšäžèŽããŸããã§ããã ããã«ããããªããžã§ã¯ããäºéã«åé€ãããå¯èœæ§ããããŸãã äŸïŒ class SelfReferential { unique_ptr<SelfReferential>& _p_self; public: SelfReferential(unique_ptr<SelfReferential>& p) : _p_self(p) {} ~SelfReferential() { _p_self.reset(); } }; unique_ptr<SelfReferential> p; p = unique_ptr<SelfReferential>(new SelfReferential(p)); p.reset(); // ~SelfReferential
resetã¡ãœãããåŒã³åºããšãSelfReferentialãã¹ãã©ã¯ã¿ãéå§ãããåã³ResetãåŒã³åºãããŸãã äºéåé€ãçºçããã®ã¯ãresetã¡ãœããããå¶åŸ¡äžã®ãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒããåé€åã§ã¯ãªãåé€åŸã«ãªã»ããããããã§ãã
shared_ptrãä¿è·ããããã¹ãã©ã¯ã¿ãnullptr
nullptrã«åæåããŠãä¿è·ããããã¹ãã©ã¯ã¿ãæã€ã¯ã©ã¹ã®shared_ptrãäœæã§ããŸããã§ããïŒ class Interface { public: virtual void do_stuff() = 0; protected: ~Interface() {} }; class Implementation : public Interface { public: void do_stuff() override { // ... } }; shared_ptr<Interface> ptr1 = make_shared<Implementation>(); // OK shared_ptr<Interface> ptr2 = nullptr; //
Visual Studio 2013ã§ã¯ããã®ã³ãŒãã¯æšæºã®æå³ã©ããã«ã³ã³ãã€ã«ãããŸãã
åç¹æ§ã©ã€ãã©ãªã§ä¿®æ£ããããã°
誀ã£ãæäœis_function
is_functionã¯ãæž¡ãããé¢æ°ã«å«ãŸããåŒæ°ãå€ãããå Žåã誀ã£ãçµæãè¿ããŸãã typedef void f(int, bool, int*, int[], int, int, int, int, int, int, int); is_function<f>::value; // false, true
ãŸããããã©ã«ã以å€ã®åŒã³åºãèŠçŽãæã€é¢æ°ã®çµæã¯èª€ã£ãŠããŸã
åæ§ã«ãis_member_function_pointerã¯ãæ瀺çã«æå®ãããåŒã³åºãèŠçŽãæã€ã¡ãœããã®çµæãæ£ããè¿ãããšãã§ããŸãã
å察ã«ãis_member_pointerã¯__cdeclã¡ãœããã§ã¯æ£ããæ©èœããŸããã
typedef void (__cdecl A::*ccall_proc)(int, long, double); is_member_pointer<ccall_proc>::value; // false, true
is_objectã¯is_functionãä»ããŠå®çŸ©ãããŠãããããå€æ°ã®é¢æ°åŒæ°ã䌎ãäžèšã®ãšã©ãŒãé©çšããããªããžã§ã¯ãã®èª€ã£ãå®çŸ©ã«ã€ãªãããŸãã
is_scalarã¯nullptr_tãèªèããŸããã§ãã
is_scalar <nullptr_t>ã¯VS2012ã§èª€ã£ãŠfalseãè¿ããŸãã-æšæºã¯nullptr_tãã¹ã«ã©ãŒåãšããŠå®çŸ©ããŠããŸããis_podã¯voidã誀解ãã
is_podã¯VS2012ã§èª€ã£ãŠtrueãè¿ããŸããããvoidã¯PODã¿ã€ãã§ã¯ãããŸããis_constructibleããªã³ã¯ã«å¯ŸããŠèª€ã£ãçµæãè¿ããŸãã
is_constructibleã¯åç §åã§ã¯æ£ããåäœããã次ã®ãããªå Žåã«falseãè¿ããŸãã is_constructible<const string&, string>::value; is_constructible<const string&, string&&>::value;
alignment_ofãšaligned_unionã®ãã°
VS2012ã®alignment_ofã¯ããã©ã€ããŒããã¹ãã©ã¯ã¿ãæã€åã§äœ¿çšãããšãã¢ã¯ã»ã¹ã§ããªããã¹ãã©ã¯ã¿ã«é¢ãã誀ã£ãèŠåãçæããŸãããŸããaligned_unionã¯VS2012ã§æ£ããæ©èœããŸããã§ããã
typedef aligned_union<16, string>::type StorageType; sizeof(string); // 24 sizeof(StorageType); // 16, 24
align_unionã«ã¯ããã³ãã¬ãŒãåŒæ°T1ã...ãTnã®ã¢ã©ã€ã¡ã³ãå€ãå«ãéçã¡ã³ããŒalignment_valueãå¿ èŠã§ãã ãã ããããã¯VS2012ã§ã¯å®è£ ãããŠããŸããã
common_typeã誀ã£ãŠvoidãè¿ããŸã
æšæºã§æ³å®ãããŠããã³ã³ãã€ã«ãšã©ãŒã®ä»£ããã«ãVS2012ã§common_typeã¯voidãè¿ããŸããã common_type<int, string>::type; // void
common_typeã¯ã*ã*å€æå¯èœãªå Žåãã«ã¹ã¿ã ã¿ã€ãã«å¯ŸããŠèª€ã£ãŠvoidãè¿ããŸãã
struct A {}; struct AWrapper { AWrapper() {} AWrapper(const A&) {} }; common_type<A, AWrapper>::type; // void
result_ofãã³ã³ãã€ã«ãããªãå ŽåããããŸã
VS2012ã§ãã®ãã³ãã¬ãŒãã§move-onlyåŒæ°ã䜿çšããããšã«ããå Žåãåé¡ãçºçããŸãã result_of<Copyable(MoveOnly&&)>::type; //
STLã³ã³ããããã³ã¢ã«ãŽãªãºã ã§ä¿®æ£ããããã°
minmax_elementã¯æ©èœããŸããã§ãã
æšæºã§ã¯ããã®ã¢ã«ãŽãªãºã ã®2ã€ã®ããŒãžã§ã³ãå®çŸ©ããŠããŸããpair<Iter, Iter> minmax_element(Iter first, Iter last) pair<Iter, Iter> minmax_element(Iter first, Iter last, Compare comp)
ïŒfirstãlastïŒãè¿ãå¿ èŠããããŸããfirstã¯æå°ã®èŠçŽ ã瀺ããlastã¯æ倧ã®èŠçŽ ã瀺ããŸããç¯å²ã空ã®å Žåã¯make_pairïŒfirstãfirstïŒãè¿ããŸãã ãã ããVS2012ã§ã¯ã代ããã«make_pairïŒmin_elementïŒfirstãlastïŒãmax_elementïŒfirstãlastïŒïŒãè¿ãããŸããã
ã³ã³ããã¯ã移åã³ã³ã¹ãã©ã¯ã¿ãæã€ããã«èª€ã£ãŠèŠçŽ ã¿ã€ããå¿ èŠãšããŸãã
ãã¹ãŠã®ã³ã³ãã移åã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã誀ã£ãŠèŠçŽ ã¿ã€ãã«ç§»åã³ã³ã¹ãã©ã¯ã¿ãŒãå¿ èŠã§ããã struct A { A() {} private: A(A&&); A(const A&); }; deque<A> source; deque<A> target(move(source)); //
åæ§ã«ãmapããã³unordered_mapèŠçŽ ã®ã¢ã¯ã»ã¹æŒç®åã«ã¯ã移åã³ã³ã¹ãã©ã¯ã¿ãŒãå¿ èŠã§ãã
map<string, A> m; A& elem = m["abc"]; //
䞊ååãšéåæã«é¢é£ãããšã©ãŒãä¿®æ£
å°æ¥ããäœæãããshared_future
VS2012ã®ãã1ã€ã®ãã°ã¯ãåç §åãšvoidã®futureãšshared_futureã®å®è£ ã«ãããŸããã ãã®ãã°ã«ããã次ã®ã³ãŒããã³ã³ãã€ã«ã§ããŸããïŒããã¯æããã«ééãã§ããå°æ¥ã¯ç§»åã®ã¿ã®ã¿ã€ããªã®ã§ïŒã future<int&> f_ref; shared_future<int&> sf_ref(f_ref); // , future<void> f_void; shared_future<void> sf_void(f_void); // ,
ã¹ã¬ããã¯ã©ã¹ã®ã¡ã¢ãªãªãŒã¯
ããã°ã©ã ã®çµäºæã«ã¡ã¢ãªãªãŒã¯ãåŒãèµ·ããå¯èœæ§ã®ãããã°ã ããã¯ãã¹ã¬ãããat_thread_exit_mutexãªããžã§ã¯ããšäžéšã®å éšããŒã¿æ§é ãäœæãããç Žå£ããããšããªãããã«çºçããŸãããpromiseããåãåã£ãå°æ¥ã®ç¡é§ãªåŸ æ©é¢æ°
Visual Studio 2012ã®ãã°ã«ããããã®ãããªfutureãªããžã§ã¯ãã®wait_forããã³wait_untilé¢æ°ã¯ãfuture_status :: timeoutãŸãã¯future_status :: readyã®ä»£ããã«future_status :: deferredãè¿ãããããã®ã¡ãœããã¯åœ¹ã«ç«ããªããªããŸãããfuture_erroräŸå€ã®ç¡å¹ãªã¡ãã»ãŒãž
ãšã©ãŒã³ãŒããšãã®èª¬æã®äžäžèŽã®ãã°ãããšãã°ããbroken promiseããšããäŸå€ãåãåããšãã¡ãã»ãŒãžã«ã¯ãfuture already retrievedããšããããã¹ããå«ãŸããŸãã ãšã©ãŒã³ãŒãã®ã¿ãæ£ããã£ããã¢ãããã¯ãã³ãã¬ãŒãã¯ãæ¢å®ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãªãã§åã«å®çŸ©ã§ããŸããã§ãã
ããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãªãã§åã«ã¢ãããã¯ãã³ãã¬ãŒãã䜿çšããããšãããšããšã©ãŒã¡ãã»ãŒãžãåãåããŸããããããã¯æ£ãããããŸãããååã¯ãã£ãããšåããŸãã
VS2012ã§ã¯ãã¢ãããã¯æäœãæŽåæ§ãã§ãã¯ã§ãªãŒããŒããŒããããããšããããŸããïŒå¿ èŠã®ãªãå Žæã§è¡ãããŸããïŒã ããã¯æšæºã«éåããŠããŸããããã³ãŒãã®åäœã¯å¯èœãªéãé ããªããŸããã VS2013ã«ã¯ãã¢ãããã¯æäœã®å®å šã«æ°ããå®è£ ããããã¯ããã«é«éã«åäœããŸããä¹±æ°çæã®ãšã©ãŒãä¿®æ£
ãããã°ã¢ãŒãã§ã¯ãmersenne_twister_engineããŒãã«åæåããããšãããšã誀ã£ãã¢ãµãŒããçæãããŸããã
minus_with_carry_engineã®ã¹ããªãŒã ã¹ããŒãã¡ã³ãã«ãæªå®çŸ©ã®åäœãåŒãèµ·ãããšã©ãŒãå«ãŸããŠããŸããã
independent_bits_engineãšshuffle_order_engineã¯ã移åã³ã³ã¹ãã©ã¯ã¿ãŒã§å éšã¡ã³ããŒãåæåããŸããã§ãããããã«ãããç¡éã«ãŒããçºçããå ŽåããããŸããã
åççãªç®è¡ã®ã©ã€ãã©ãªã®ãã°ãä¿®æ£
ã©ã€ãã©ãªã«ã¯ããã€ãã®ãã°ãèŠã€ãããŸããã
VS2012ã§æ¬¡ã®ã³ãŒããæžãããšãã§ããŸããã§ãã
ratio_add<ratio<1, 2>, ratio<1, 3>>::num; ratio_add<ratio<1, 2>, ratio<1, 3>>::den;
代ããã«ããããã®ã¿ã€ããä»ããŠååãšåæ¯ã«ã¢ã¯ã»ã¹ããå¿ èŠããããŸããã
ratio_add<ratio<1, 2>, ratio<1, 3>>::type::den; ratio_add<ratio<1, 2>, ratio<1, 3>>::type::num;
ãã1ã€ã®ééãã¯ãæ¯èŒã®å®è£ ã§ãã
cout << "2/60 < -1/3: " << ratio_less<r2_60, r1_3>::value << endl; // false cout << "2/60 < 1/-3: " << ratio_less<r2_60, ratio<1, -3>>::value << endl; // true false
ãããã£ãŠãVS2012ã§ã¯ããã³ãã¬ãŒãã«æž¡ãããåæ¯ãåžžã«æ£æ°ã§ããããšã確èªããå¿ èŠããããŸããã
å¥ã®ãã°ã¯ãratio_equalãäžçåŒãæ£ããå€æããããå¿ ãããçåŒãæ£ããå€æãããšã¯éããªãã£ãããšã§ãã
ratio_equal<ratio<1, 4>, ratio<4, 16>>::value; // false true
ãããŠãããã«å¥ã®ãã°ããããŸãã æ¯ç<NãD>ããããDããŒããŸãã¯intmax_tãã倧ããæ°å€ã®å Žåãããã°ã©ã ã¯ééããªãç¡å¹ã§ãã ãã ããVisual Studio 2012ã¯ãã®ãããªãšã©ãŒãæ€åºããŸããã§ããã
typedef ratio<1, 0> r_error; cout << r_error::den << endl; // ,
typedef ratio<INTMAX_MIN, 1> r_error2; cout << r_error2::num << endl; // ,
Visual Studioã®å®è£ ã§ã¯ããããã®ç¶æ³ã§ããªã¬ãŒãããstatic_assertã¹ããŒãã¡ã³ãã¯æ¯çã³ã³ã¹ãã©ã¯ã¿ãŒã«é 眮ãããŸãã ãã ããã³ã³ã¹ãã©ã¯ã¿ã¯ã¯ã©ã¹ã®ãªããžã§ã¯ããäœæãããšãã«ã®ã¿æ©èœããŸãããäžèšã®äŸã§ã¯ããã¯çºçããŸããã
åæ§ã«ãäžéšã®ã³ãŒãã¯ã³ã³ãã€ã«ãããŸããããããã¹ãã§ã¯ãããŸããã
// , - ratio_multiply<ratio<1, INTMAX_MAX>, ratio<1, 2>>::type;
Visual Studio 2013ã®ãã®ä»ã®ãšã©ãŒ
Tuple_elementã¯ãå¢çå€ãžã®åºå ¥ãããã§ãã¯ããŸãã
tuple_element <Iãé å<TãN >>ã¯ãI <Nã§ããããšã確èªããããã§ãªãå Žåã¯ã³ã³ãã€ã«ããªãã§ãã ããã ããã¯VS2013ãŸã§çºçããŸããã§ãããstd ::é¢æ°ã®boolãžã®ç¡å¹ãªå€æ
çè«çã«ã¯æ¬¡ã®ããã«ãã¹ããšãã«ãªããžã§ã¯ãã空ã§ã¯ãªãã£ããããå Žåã«ãã£ãŠã¯ãVS2012ã§å€æã«ãã£ãŠèª€ã£ãçµæãåŸãããããšããããŸããã // JetPlane Plane function<bool(JetPlane*)> plane_ready_func = function<bool(Plane*)>(); if (plane_ready_func) // false, { plane_ready_func(nullptr); // bad_function_call }
å³èŸºå€ã®å²ãåœãŠ
Visual Studio 2012ã¯ãæšæºã§å®çŸ©ãããŠããå³èŸºå€ã®å²ãåœãŠãçŠæ¢ããŠããŸããã struct Dummy { int _x; }; Dummy get_dummy() { Dummy d = { 10 }; return d; } get_dummy()._x = 20; // ,
alignïŒïŒããã©ã¡ãŒã¿ã誀ã£ãŠæŽæ°ããŸã
ãã®é¢æ°ã¯æ»ãã¢ãã¬ã¹ãæ£ããèšç®ããŸãããæåŸã®2ã€ã®ãã©ã¡ãŒã¿ãŒã誀ã£ãŠæŽæ°ããŸãã void* p = (void*)0x1; // 200 32 // 230 size_t space = 230; void* res = align(32, 200, (void*&)p, space); // res null 31 , // 30 space = 256; // 256 res = align(32, 200, (void*&)p, space); // res 0x20 ( 32) // p 0xE8 (200 + 32) 0x20 // space 25 225
time_putã¯wchar_tã§ã¯æ©èœããŸãã
time_putã¯ãwchar_tã®åæåæã«åºåãçæããŸããããããã«
Stephan Lavavejãæžãããã®æçš¿ã§ãVS2013ã®å€æŽã®å®å šãªãªã¹ãïŒC ++ 11ã ãã§ãªãïŒãèªãããšãã§ããŸãã
æ°ããC ++ 11æ©èœã®å®è£ ã«å ããŠãVisual Studio 2013ã¯ãã³ã³ãã€ã©ãšã©ã€ãã©ãªã®æ¢åã®æ©èœã®å€ãã®ãã°ãä¿®æ£ããŸãããäžæ£ãªã³ã³ãã€ã©ãšã©ãŒããã¡ã¢ãªãªãŒã¯ãããã©ãŒãã³ã¹ã®äœäžãŸã§ã ããã¯ééããªãååããªåŸåã§ãã
æ®å¿µãªãããVS2013ã«ã¯VS2012ããç¶æ¿ãããããã€ãã®ãã°ããŸã å«ãŸããŠãããããã€ãã®æ°ãããã°ãè¿œå ãããŠããŸãã ç§ã¯ä»ããã®ãã¹ãŠã«ã€ããŠæ¬ãæžããŠããŸããããŸã å®æããŠããŸãããã ä»ããèªãããšãã§ããŸãã