Visual C ++ã³ã³ãã€ã©ã®ããŒãžã§ã³ãæŽæ°ããå ŽåïŒããšãã°ãVisual Studioã2013ãã2015ã«åãæ¿ãããªã©ïŒã以åã«æ£åžžã«ã³ã³ãã€ã«ããã³å®è¡ãããã³ãŒããã³ã³ãã€ã«ãšã©ãŒãåŒãèµ·ãããšããäºå®ã«ééããçç±ãèŠã€ããããã®å Žéãã§ã¯ãããŸãã/ãŸãã¯ã©ã³ã¿ã€ã ãšã©ãŒã
ãããã®åé¡ã¯ãC ++æšæºã«æºæ ããããã®ã³ã³ãã€ã©ãžã®å€æ°ã®å€æŽã颿°ã·ã°ããã£ã®å€æŽããŸãã¯ã¡ã¢ãªå
ã®ãªããžã§ã¯ãã®å Žæã®å€æŽã«ãã£ãŠçºçããå¯èœæ§ããããŸãã
å®è¡æãšã©ãŒïŒæãèŠã€ãã«ããããšãããã£ãŠããïŒãåé¿ããããã«ãå¥ã®ããŒãžã§ã³ã®ã³ã³ãã€ã©ãåãåã£ããã€ããªãã¡ã€ã«ãšéçãªã³ã¯ãäœæããªãããšããå§ãããŸãã ãŸããããã°ã©ã ïŒEXEãŸãã¯DLLïŒãæŽæ°ãããšãã¯ã䜿çšããã©ã€ãã©ãªãæ°ããããŒãžã§ã³ã®ã³ã³ãã€ã©ã§ã³ã³ãã€ã«ãããŠããããšã確èªããŠãã ããã
CRTïŒCã©ã³ã¿ã€ã ïŒãŸãã¯STLïŒæšæºãã³ãã¬ãŒãã©ã€ãã©ãªïŒã®åã䜿çšããå Žåã¯ãç°ãªãããŒãžã§ã³ã®ã³ã³ãã€ã©ã§ã³ã³ãã€ã«ããããã€ããªïŒDLLãå«ãïŒéã§åã転éããªãã§ãã ããã ãã®åé¡ã«ã€ããŠã¯ã
DLLã®å¢çãè¶ããŠCRTãªããžã§ã¯ããæž¡ãæœåšçãªãšã©ãŒã§è©³ãã説æã
ãŸã ã
ãŸããå°æ¥çã«ã¯ãã¡ã¢ãªå
ã®ãªããžã§ã¯ãã®ç¹å®ã®å Žæã«äŸåããã³ãŒããäœæããªãããšããå§ãããŸãïŒCOMã€ã³ã¿ãŒãã§ã€ã¹ãŸãã¯PODãªããžã§ã¯ãã§ãªãéãïŒã ãã®ãããªã³ãŒããããå Žåãã³ã³ãã€ã©ãæŽæ°ããåŸããã¹ãŠãæ£åžžã«æ©èœããããšã確èªããå¿
èŠããããŸãã 詳现ã«ã€ããŠã¯ã
ABIå¢çã§ã®ç§»æ€æ§ïŒModern C ++ïŒãåç
§ããŠãã ãã ã
次ã®èšäºã§ã¯ãVisual C ++ã³ã³ãã€ã©ïŒVisual Studio 2015 Previewã«ä»å±ïŒã®å€æŽã«ã€ããŠèª¬æããŸãã ãã®èšäºã§ã¯ããæ°ããåäœããšãä»ããšããèšèã¯ãã®ããŒãžã§ã³ãæ£ç¢ºã«æãããå€ãåäœããšã以åã®ãã¯Visual Studio 2013ïŒããã³ä»¥åã®ããŒãžã§ã³ïŒãæããŸãã
èŠçŽïŒ
-ã³ã³ãã€ã©ã®å€æŽ
-Cã©ã³ã¿ã€ã ã©ã€ãã©ãªïŒCRTïŒã®å€æŽ
-STLã®å€æŽ
-MFCããã³ATLã®å€æŽ
ã³ã³ãã€ã©ã®å€æŽ
- / ZcïŒforScope-ã³ã³ãã€ã©ãã©ã°
/Zc:forScope-
éæšå¥šã§ãããä»åŸåé€ãããŸãã ãã®ãã©ã°ã䜿çšãããšãã³ã³ãã€ã©ã¯èŠåD9035ãã¹ããŒããŸãã
ãã®ãã©ã°ã¯ãéæšæºã®C ++æ¡åŒµæ©èœïŒãã®ã«ãŒãå€ã®for
ã«ãŒãã®èª¬æã§å®£èšããã倿°ã®äœ¿çšïŒã䜿çšããããã«äœ¿çšãããŸãã ãã®ãã©ã°ã¯ãå¥ã®ãã©ã°ãèšå®ãããŠããå Žåã«ã®ã¿å¿
èŠã§ã- /Za
ïŒ æšæºã«æºæ ïŒ /Za
ããªãå Žåãã«ãŒãèšè¿°ããã®å€æ°ã®äœ¿çšã¯ããã©ã«ãã§æå¹ã«ãªã£ãŠããŸãã ã¯ãã¹ãã©ãããã©ãŒã ãå¿é
ããå¿
èŠããªãå ŽåïŒããšãã°ãä»ã®ã³ã³ãã€ã©ãŒã«ããã³ãŒãã®åéãç®çãšããŠããªãå ŽåïŒã /Za
ãã©ã°ããªãã«ããããšãã§ããŸãïŒãããžã§ã¯ãããããã£ãDisable Language ExtensionsãããNoãã«èšå®ããŸãïŒã ã¯ãã¹ãã©ãããã©ãŒã ãšæšæºãžã®æºæ ãéèŠããå Žåã¯ã倿°å®£èšãã«ãŒãã®äžã«ç§»åããŠããã®ãããªã³ãŒãã®ã»ã¯ã·ã§ã³ãæžãæããå¿
èŠããããŸãã
- / Zg
/Zg
ã³ã³ãã€ã©ãã©ã°ïŒ ãããã¿ã€ãã³ã°é¢æ° ïŒã¯äœ¿çšã§ããªããªããŸããïŒä»¥åã¯éæšå¥šã®å±æ§ã§ããïŒ
- ããã§ãmstest.exeã䜿çšããŠã³ãã³ãã©ã€ã³ããC ++ / CLIã䜿çšããŠåäœãã¹ããå®è¡ã§ããªããªãã代ããã«vtest.console.exeã䜿çšããå¿
èŠããããŸãã 詳现ã«ã€ããŠã¯ã VSTest.Console.exeã³ãã³ãã©ã€ã³ãªãã·ã§ã³ãåç
§ããŠãã ãã ã
- å¯å€ããŒã¯ãŒã
çŸåšãæšæºã«åŸã£ãŠmutable
ã®äœ¿çšã¯ã¯ã©ã¹ã¡ã³ããŒã®ååã«ã®ã¿é©çšã§ãããªã³ã¯ããŸãã¯const
ãŸãã¯static
ãšããŠå®£èšãããååã«ã¯é©çšã§ããŸããã äŸïŒ
struct S { mutable int &r; };
ããã¯ã³ã³ãã€ã«ã«äœ¿çšãããŠããŸããããçŸåšã³ã³ãã€ã©ã¯ãšã©ãŒC2071ãã¹ããŒããŸãã ä¿®æ£ããã«ã¯ã mutable
ãåé€ããã ãã§ãã
- char_16_tããã³char_32_t
çŸåšãchar_16_tããã³char_32_tã¯ãŠãŒã¶ãŒã¿ã€ãã®ãšã€ãªã¢ã¹ãšããŠäœ¿çšã§ããŸããããããã®ã¿ã€ãã¯çµã¿èŸŒã¿ãšããŠå®çŸ©ãããŠããããã§ãã ã©ã€ãã©ãªäœæè
ãchar_16_tãšchar_32_tãããããuint_16_tãšuint_32_tã®ãšã€ãªã¢ã¹ãšããŠå®çŸ©ããããšã¯ãéåžžã«äžè¬çãªæ
£ç¿ã§ããã
#include <cstdint> typedef uint16_t char16_t; //C2628 typedef uint32_t char32_t; //C2628 int main(int argc, char* argv[]) { uint16_t x = 1; uint32_t y = 2; char16_t a = x; char32_t b = y; return 0; }
ä¿®æ£ããã«ã¯ããšã€ãªã¢ã¹ã®å®£èšãåé€ããæ°ããå
¥åãããã®ãšç«¶åããä»ã®èå¥åã®ååã倿Žããå¿
èŠããããŸãã
- éåãã³ãã¬ãŒããã©ã¡ãŒã¿
åã®äºææ§ã«ã€ããŠãéæšæºã®ãã³ãã¬ãŒããã©ã¡ãŒã¿ãå«ãã³ãŒããæ£ãããã§ãã¯ãããããã«ãªããŸããã ããšãã°ã次ã®ã³ãŒãã¯ãšã©ãŒãªãã§ã³ã³ãã€ã«ããããã«äœ¿çšãããŸããã
struct S1 { void f(int); void f(int, int); }; struct S2 { template <class C, void (C::*Function)(int) const> void f() {} }; void f() { S2 s2; s2.f<S1, &S1::f>(); }
ãã³ãã¬ãŒããã©ã¡ãŒã¿ã®åãæž¡ãããåŒæ°ã®åãšäžèŽããªããããã³ã³ãã€ã©ã¯ãšã©ãŒãã¹ããŒããŸãïŒãã©ã¡ãŒã¿ã®åã¯å®æ°ã¡ãœãããžã®ãã€ã³ã¿ã§ãããfã¯å®æ°ã§ã¯ãããŸããïŒã
error C2893: Failed to specialize function template 'void S2::f(void)'
note: With the following template arguments:
note: 'C=S1'
note: 'Function=S1::f'
ãã®ãšã©ãŒãåãé€ãã«ã¯ããã³ãã¬ãŒãåŒæ°ã®ã¿ã€ãããã©ã¡ãŒã¿ãŒã®ã¿ã€ããšäžèŽããŠããããšã確èªããŠãã ããã
- __declspecïŒäœçœ®åããïŒ
ã³ã³ãã€ã©ãŒã¯ã颿°ã®__declspec(align)
ãåãå
¥ããªããªããŸããã å®éãåœŒã¯æ±ºããŠåãå
¥ããŸããã§ããããä»ã§ã¯ãšã©ãŒC3323ãåºããŸãã ãããåãé€ãã«ã¯ã颿°å®£èšãããã®åŒãåé€ããã ãã§ãã ããã¯ä»¥åã¯å¹æããªãã£ããããããã°ã©ã ã®å
容ã¯å€æŽãããŸããã
- äŸå€åŠç
äŸå€åŠçã«ã¯ããã€ãã®å€æŽããããŸãã ãŸããäŸå€ãªããžã§ã¯ãã¯ã³ããŒå¯èœã§ç§»åå¯èœã§ãªããã°ãªããŸããã 以åã¯ãåæ§ã®ã³ãŒããã³ã³ãã€ã«ãããŠããŸããããçŸåšã¯ãšã©ãŒãçºçããŸãã
struct S { public: S(); private: S(const S &); }; int main() { throw S();
ããã§ã®åé¡ã¯ãã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒããã©ã€ããŒããšããŠå®£èšãããŠããããããªããžã§ã¯ããã³ããŒã§ããªãããšã§ããããã¯éåžžãäŸå€ãåŠçãããšãã«å¿
èŠã§ãã ã³ã³ã¹ãã©ã¯ã¿ãŒãexplicit
宣èšãããŠããå Žåãåãã§ãã
struct S { S(); explicit S(const S &); }; int main() { throw S();
ãã®åé¡ãåãé€ãã«ã¯ãäŸå€ãªããžã§ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒããããªãã¯ãŸãŒã³ãšexplicit
宣èšãããŠããããšã確èªããŠãã ããã
äŸå€ããã£ããããå Žåããªããžã§ã¯ããã³ããŒããå¿
èŠããããŸãã æ¬¡ã®ã³ãŒãã¯ä»¥åã®ããŒãžã§ã³ã®Visual Studioã§ã³ã³ãã€ã«ãããŸãããçŸåšã¯ãšã©ãŒãçºçããŸãã
struct B { public: B(); private: B(const B &); }; struct D : public B { }; int main() { try { } catch (D d)
ãã®ãšã©ãŒã¯ããªã³ã¯ã§äŸå€ãåãå
¥ããããšã§ä¿®æ£ã§ããŸãã
catch(D& d) { }
- è¡ãšãã¯ã
ã³ã³ãã€ã©ãŒã¯ããŠãŒã¶ãŒå®çŸ©ãªãã©ã«ïŒUDLïŒããµããŒãããããã«ãªããŸããã ãã®çµæãæååïŒæ£ç¢ºã«ã¯æååãªãã©ã«ïŒã®åŸã«ã¹ããŒã¹ã®ãªããã¯ããç¶ããšãUDLãšããŠè§£éããããšã©ãŒãŸãã¯äºæããªãçµæãçããå¯èœæ§ããããŸãã ããšãã°ã以åã¯åé¡ãªãã³ã³ãã€ã«ãããŠããŸããã
#define _x "there" char* func() { return "hello"_x; } int main() { char * p = func(); return 0; }
ã³ã³ãã€ã©ã¯ãfunc颿°ã«ãã£ãŠè¿ãããå€ãæååãhelloããšè§£éãããthereãã«å±éããããã¯ãã2ã€ã®ãªãã©ã«ã1ã€ã«çµåããŸããã çŸåšãã³ã³ãã€ã©ã¯ãããUDLãšããŠè§£éããŸãããç¥ã£ãŠããUDLã®äžãã_xã®å®çŸ©ãèŠã€ããããšãã§ããªãããããšã©ãŒãã¹ããŒããŸãã
error C3688: invalid literal suffix '_x'; literal operator or literal operator template 'operator ""_x' not found
note: Did you forget a space between the string literal and the prefix of the following string literal?
ãã®åé¡ã解決ããã«ã¯ãè¡ãšãã¯ãã®éã«ã¹ããŒã¹ãå
¥ããå¿
èŠããããŸãã
- è¿ãã®å
åã®ã±ãŒã¹ãšåæ§ã«ãæååã®è§£æã®å€æŽã«ãããã¹ããŒã¹ãå
±æããªãæååãªãã©ã«ã®é£åå£«ã®æ§ç¯ã¯ä»¥åã¯åäžè¡ãšããŠè§£éãããŠããŸããããæ£ããã³ã³ãã€ã«ã®ããã«ã¹ããŒã¹ã远å ããå¿
èŠããããŸãïŒ
char * str = "abc""def";
è¡éã«ã¹ããŒã¹ã远å ããã ãã§ãïŒ
char * str = "abc" "def";
- æ°èŠãã¹ãã£ã³ã°ãšåé€
C ++ 14æšæºã«æºæ ããããã«ã delete
æŒç®åã®åäœã倿ŽãããŸããã 詳现ã¯ã C ++ Sized Deallocationã«èšèŒãããŠããŸãã ãªããžã§ã¯ãã®ãµã€ãºãåãã°ããŒãã«delete
æŒç®åã®åœ¢åŒã远å ãããŸããã ãã®å€æŽã®éèŠæ§ã¯ãã³ãŒãã«ïŒãã¹ãã®new
æŒç®åã«å¯Ÿå¿ããïŒåã眲åã®delete
æŒç®åãããå Žåãã³ã³ãã€ã©ããã®å Žæã§æ±ºå®ããããšããŠãããããã³ã³ãã€ã«ãšã©ãŒïŒ new
æŒç®åã䜿çšããè¡ãæãC2956ïŒãçºçããããšã§ãé©åãªdelete
æŒç®åïŒã
颿°void operator delete(void*, size_t)
ã¯ãC ++ 11ã®é
眮æŒç®ånew
- void* operator new(size_t, size_t)
ã®é¢æ°ã«å¯Ÿå¿ããé
眮æŒç®ådelete
ã§ããã æ°ããC ++ 14æšæºã§ã¯ããã®delete
éåžžã®å²ãåœãŠè§£é€é¢æ°ïŒã€ãŸããã°ããŒãã«delete
æŒç®åïŒã«ãªããŸããã æšæºã§ã¯ä»¥äžãå¿
èŠã§ã-ãã¹ãnew
ã察å¿ããdelete
ãæ¢ããæšæºæ©èœãèŠã€ããå Žåãããã°ã©ã ã¯ã³ã³ãã€ã«ãããŸããã
ããšãã°ãã³ãŒãã§ãã¹ãnew
ããã³delete
å®çŸ©ãããšããŸãã
void * operator new(std::size_t, std::size_t); void operator delete(void*, std::size_t) noexcept;
ããã§ã®åé¡ã¯æ¬¡ã®ãšããã§ãã delete
è¡ãæŒç®åã®èª¬æã¯ãæ°ããã°ããŒãã«æŒç®åã®èª¬æãšäžèŽããŸãã ãã®ãããªäžèŽãé¿ããããã«ã new
ããã³delete
æŒç®åã§ãµã€ãºãèšè¿°ãããšãã«ãsize_t以å€ã®ã¿ã€ãã䜿çšã§ããŸãã ããã§ã¯ãsize_tãã³ã³ãã€ã©ã«äŸåããããšãèæ
®ããå¿
èŠããããŸããVisualC ++ã§ã¯ãããã¯unsigned intã®ãšã€ãªã¢ã¹ã§ãã ããã§ã®è¯ã解決çã¯ãåæã䜿çšããããšã§ãã
enum class my_type : size_t {};
次ã«ãnew_ã®å®£èšã倿Žããsize_tã®ä»£ããã«my_typeã2çªç®ã®ãã©ã¡ãŒã¿ãŒãšããŠåãå
¥ããããã«é
眮æŒç®åãdelete
å¿
èŠããããŸãã ãŸãã new
åŒã³åºããžã®åŒæ°ã®è»¢éãä¿®æ£ãïŒããšãã°ã static_cast<my_type>
ã䜿çšããŠæŽæ°å€ããåæã«å€æããïŒãé
眮æŒç®åã®å®çŸ©ã倿ŽããŠãåæããæŽæ°åã«å€æããå¿
èŠããããŸãã ãªã¹ãã«å ããŠãããšãã°ãsize_tåã®ãã£ãŒã«ããæã€ã¯ã©ã¹ã䜿çšã§ããŸãã
代æ¿ãœãªã¥ãŒã·ã§ã³ãšããŠããã¹ãnew
åé€ã§ããŸãã ã³ãŒããnew
ãã¹ãã䜿çšããŠããŒã«ãå®è£
ããæž¡ããããµã€ãºããã¹ããŸãã¯åé€ãããªããžã§ã¯ãã®ãµã€ãºã§ããå Žåãæ°ããdelete
æŒç®åã¯ãã®ããŒã«ã®åé€ã«é©ããŠããå¯èœæ§ããããŸãã
ã³ãŒãå
ã§ãããã®æŒç®åã®åäœãä»ãã倿Žããããªãå Žåã¯ãä»ã®ãšãã/ ZcïŒsizedDealloc-ãã©ã°ã䜿çšããŠãå€ãåäœãè¿ããŸãã ã€ãŸãã2åŒæ°ã®åé€é¢æ°ã¯äœæãããªããããå®çŸ©ããåé€é¢æ°ãšç«¶åããããšã¯ãããŸããã
- ãŠããªã³ããŒã¿ã¡ã³ããŒ
ãªã³ã¯ããŠããªã³ãã£ãŒã«ãã«ããããšã¯ã§ããªããªããŸããã ãã®ã³ãŒãã¯ã³ã³ãã€ã«ã«äœ¿çšãããŠããŸããããçŸåšã§ã¯å®è¡ãããŸãã
union U1 { const int i; }; union U2 { int &i; }; union U3 { struct {int &i;}; };
çŸåšã次ã®ãšã©ãŒãçºçããŸãã
test.cpp(67): error C2625: 'U2::i': illegal union member; type 'int &' is reference type
test.cpp(70): error C2625: 'U3::i': illegal union member; type 'int &' is reference type
ãã®åé¡ã解決ããã«ã¯ããã€ã³ã¿ãŸãã¯éåžžã®å€ãžã®ãªã³ã¯ã倿Žããå¿
èŠããããŸãã åããã€ã³ã¿ãŒã«å€æŽããã«ã¯ããã®ãã£ãŒã«ãã«ã¢ã¯ã»ã¹ããã³ãŒãã倿Žããå¿
èŠããããŸãã ã¿ã€ããå€ã«å€æŽãããšããŠããªã³ã®å€ã倿Žã§ããããã«ãªãããŠããªã³ã®ä»ã®ãã£ãŒã«ãã«åœ±é¿ããŸãã ãŸãããã®å ŽåããŠããªã³ã®ãµã€ãºã倿Žãããå ŽåããããŸãã
- ååã®ãªãçµåïŒå¿åçµåïŒ
ååã®ãªãåäŒã¯ãæšæºã«æ²¿ã£ããã®ã«ãªããŸããã 以åã¯ãå¿åã®é¢é£ä»ãã®å Žåãæç€ºçãªã³ã³ã¹ãã©ã¯ã¿ãŒãšãã¹ãã©ã¯ã¿ãŒãçæãããŠããŸããã çŸåšããããã¯å逿žã¿ãšå®£èšãããŠããŸãã
struct S { S(); }; union { struct { S s; }; } u;
Visual Studio 2015 Previewã§ã¯ã次ã®ãšã©ãŒãçæãããŸãã
error C2280: '<unnamed-type-u>::<unnamed-type-u>(void)': attempting to reference a deleted function
note: compiler has generated '<unnamed-type-u>::<unnamed-type-u>' here
ãã®åé¡ã解決ããã«ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãŸãã¯ãã¹ãã©ã¯ã¿ãå®çŸ©ããå¿
èŠããããŸã
struct S {
- å¿åæ§é ãšã®é¢é£ä»ã
æšæºãžã®æºæ ãä¿èšŒããããã«ãé¢é£ä»ãå
ã®å¿åæ§é ã®ã¡ã³ããŒã®å®è¡æã®åäœã倿ŽãããŸããã å¿åæ§é ã®ã³ã³ã¹ãã©ã¯ã¿ãŒïŒé¢é£ä»ãã®ã¡ã³ããŒïŒã¯ãé¢é£ä»ããäœæããããšãã«æé»çã«åŒã³åºãããããšã¯ãªããªããŸããã ãŸãããã®ãããªãã£ãŒã«ãã®ãã¹ãã©ã¯ã¿ã¯ããŠããªã³ãå¯èŠæ§ãããã¯ããåºããšãã«æé»çã«åŒã³åºãããããšã¯ãããŸããã äŸïŒ
#include <stdio.h> struct S { S() { printf("Creating S\n"); } ~S(){ printf("Destroying S\n"); } }; union U { struct { S s; }; U() {} ~U(){} }; void f() { U u; // } int main() { f(); char s[1024]; printf("Press any key.\n"); gets_s(s); return 0; }
以åã¯ãã³ã³ã¹ãã©ã¯ã¿ãšãã¹ãã©ã¯ã¿ã®äž¡æ¹ãåŒã³åºãããŠããŸããã ä»ã§ã¯åŒã³åºãããŸããã ã³ã³ãã€ã©ãŒã¯èŠåãçæããŸãã
warning C4587: 'U::s': behavior change: constructor is no longer implicitly called
warning C4588: 'U::s': behavior change: destructor is no longer implicitly called
å€ãåäœã埩å
ããã«ã¯ãå¿åæ§é ã«ååãä»ããå¿
èŠããããŸãã éå¿åæ§é ã®å®è¡æã®åäœã¯ãã³ã³ãã€ã©ã®ããŒãžã§ã³ã«äŸåããŸããã
#include <stdio.h> struct S { S() { printf("Creating S.\n"); } ~S() { printf("Destroying S\n"); } }; union U { struct { S s; } namedStruct; U() {} ~U() {} }; void f() { U u; } int main() { f(); char s[1024]; printf("Press any key.\n"); gets_s(s); return 0; }
å¥ã®è§£æ±ºçãšããŠãã³ã³ã¹ãã©ã¯ã¿ãšæ§é ãã¹ãã©ã¯ã¿ã®ã³ãŒããæ°ããã¡ãœããã«è»¢éãããŠããªã³ã®ã³ã³ã¹ãã©ã¯ã¿ãšãã¹ãã©ã¯ã¿ããããããåŒã³åºãããšãã§ããŸãã
#include <stdio.h> struct S { void Create() { printf("Creating S.\n"); } void Destroy() { printf("Destroying S\n"); } }; union U { struct { S s; }; U() { s.Create(); } ~U() { s.Destroy(); } }; void f() { U u; } int main() { f(); char s[1024]; printf("Press any key.\n"); gets_s(s); return 0; }
- ãã³ãã¬ãŒã解決
ãã³ãã¬ãŒãã®åå解決ã倿ŽãããŸããã C ++ã§ã¯ãåå解決ã®åè£ãæ€èšãããšãã«ã1ã€ä»¥äžã®ååããã³ãã¬ãŒãã®ç¡å¹ãªã€ã³ã¹ã¿ã³ã¹åã§ããå¯èœæ§ãéåžžã«é«ãã§ãã ãããã®èª€ã£ãå®è£
ã¯éåžžãã³ã³ãã€ã«ãšã©ãŒãåŒãèµ·ãããŸããïŒSFINAEãšããŠç¥ãããååã䜿çšãããŠããããïŒã
SFINAEãã³ã³ãã€ã©ã«ã¯ã©ã¹ãã³ãã¬ãŒããã€ã³ã¹ã¿ã³ã¹åããããã«èŠæ±ããå Žåããã®ã€ã³ã¹ã¿ã³ã¹åäžã®ãšã©ãŒã¯ãã¹ãŠã³ã³ãã€ã©ãšã©ãŒãšèŠãªãããŸãã 以åã¯ããããã®ãšã©ãŒã¯ç¡èŠãããŠããŸããã äŸïŒ
#include <type_traits> template<typename T> struct S { S() = default; S(const S&); S(S&&); template<typename U, typename = typename std::enable_if<std::is_base_of<T, U>::value>::type> S(S<U>&&); }; struct D; void f1() { S<D> s1; S<D> s2(s1); } struct B { }; struct D : public B { }; void f2() { S<D> s1; S<D> s2(s1); }
æ°ããã³ã³ãã€ã©ã¯ã次ã®ãšã©ãŒã¡ãã»ãŒãžã衚瀺ããŸãã
type_traits(1110): error C2139: 'D': an undefined class is not allowed as an argument to compiler intrinsic type trait '__is_base_of'
..\t331.cpp(14): note: see declaration of 'D'
..\t331.cpp(10): note: see reference to class template instantiation 'std::is_base_of<T,U>' being compiled
ãš
[
T = D
U = D
]
ãšã©ãŒã®çç±ã¯ã is_base_of
ã®æåã®åŒã³åºãã®å Žæã§is_base_of
ã¯ã©ã¹DããŸã å®çŸ©ãããŠããªãããã§ãã
ãã®å Žåããšã©ãŒä¿®æ£ã¯æ¬¡ã®ããã«ãªããŸããã¯ã©ã¹ãå®çŸ©ããåã«ãã®ãããªåãã§ãã¯ã䜿çšããå¿
èŠã¯ãªããããBãšD dã®å®çŸ©ããã¡ã€ã«ã®å
é ã«è»¢éããå¿
èŠããããŸãã ãããã®å®çŸ©ãããããŒãã¡ã€ã«ã«ããå Žåãåé¡ã®ãããã³ãã¬ãŒãã䜿çšãããåã«ãã¯ã©ã¹å®çŸ©ãå«ãŸããŠããããšã確èªããããã«ãå
å«é åºã確èªããå¿
èŠããããŸãã
- ã³ã³ã¹ãã©ã¯ã¿ãŒãã³ããŒãã
Visual Studio 2013ãšVisual Studio 2015 RCã®äž¡æ¹ã§ããã®ã¯ã©ã¹ã«ãŠãŒã¶ãŒå®çŸ©ã®ç§»åã³ã³ã¹ãã©ã¯ã¿ãŒãããããŠãŒã¶ãŒå®çŸ©ã®ã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒããªãå Žåãã³ã³ãã€ã©ãŒã¯ã¯ã©ã¹ã®ã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒãäœæããŸãã Dev14ã§ã¯ããã®æé»çã«çæãããã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒã¯ã=åé€ããšããŠããŒã¯ãããŸãã
Cã©ã³ã¿ã€ã ã©ã€ãã©ãªïŒCRTïŒã®å€æŽ
äžè¬çãªå€æŽ
- ãã€ããªãã¡ã€ã«ã®ãªãã¡ã¯ã¿ãªã³ã°
CRTã©ã€ãã©ãªã¯ã2ã€ã®ãã€ããªãã¡ã€ã«ã«åå²ãããŸãããæšæºCRTã©ã€ãã©ãªïŒUniversal CRT-ucrtbaseïŒã¯ãã»ãšãã©ã®æšæºæ©èœãå«ã¿ãVCã©ã³ã¿ã€ã ã©ã€ãã©ãªïŒvcruntime140ïŒã¯ãã³ã³ãã€ã©äŸåæ©èœïŒäŸå€åŠçãçµã¿èŸŒã¿é¢æ°ïŒçµã¿èŸŒã¿é¢æ°ïŒïŒã æšæºã®ãããžã§ã¯ãèšå®ã䜿çšããå Žåããªã³ã«ãŒã¯ãããã®æ°ããã©ã€ãã©ãªãèªåã§äœ¿çšããããããã®å€æŽã«ãã圱é¿ã¯ãããŸããã Ignore All Default Librariesã®ãããžã§ã¯ããªã³ã«ãŒããããã£ãYesã«èšå®ããå ŽåããŸãã¯/ NODEFAULTLIBãªã³ã«ãŒãã©ã°ã䜿çšããå Žåã¯ãã©ã€ãã©ãªã®ãªã¹ãïŒãããžã§ã¯ãããããã£Additional Dependencies ïŒãæŽæ°ããå¿
èŠããããŸããã€ãŸããèªåã§æ°ããã©ã€ãã©ãªãå«ããŸãã ããããå€ãCRTã©ã€ãã©ãªïŒlibcmt.libãlibcmtd.libãmsvcrt.libãmsvcrtd.libïŒãæ°ããåçã®ãã®ã«çœ®ãæããŸãã 2ã€ã®æ°ããã©ã€ãã©ãªã«ã¯ãããããéçïŒ.libïŒããŒãžã§ã³ãšåçïŒ.dllïŒããŒãžã§ã³ã®ã»ãããªãªãŒã¹ãã«ãïŒãµãã£ãã¯ã¹ãªãïŒãšãããã°ãã«ãïŒãµãã£ãã¯ã¹ãdãä»ãïŒããããŸãã 詳现ã¯ãã¡ãïŒ CRTã©ã€ãã©ãªã®æ©èœ
<locale.h>
- localeconv
ã¹ã¬ããããšã®ãã±ãŒã«ãæå¹ã«ãªã£ãŠããå Žåãlocale.hã§å®£èšãããlocaleconv颿°ãæ£ããæ©èœããããã«ãªããŸããã 以åããã®é¢æ°ã¯Iconvã°ããŒãã«ãã±ãŒã«ãè¿ããŸããããã¹ããªãŒãã³ã°ãã±ãŒã«ã¯è¿ããŸããã§ããã
ã¹ããªãŒãã³ã°ãã±ãŒã«ã䜿çšããå Žåã¯ãæ°ããlocaleconvã®åäœãããã°ã©ã ã«ã©ã®ããã«åœ±é¿ãããã確èªããå¿
èŠããããŸãã
<math.h>
- C ++ã©ã€ãã©ãªé¢æ°ã®ãªãŒããŒããŒã
以åã¯ããã¹ãŠã§ã¯ãããŸããããããã€ãã®æ°åŠã©ã€ãã©ãªé¢æ°ã<math.h>
ãªãŒããŒããŒããããŠããŸããã . , <math.h> . <math.h>
.
IEEE-754 F C11, (NaN ). , NaN , - . : IEEE 754 Standard , Annex F of the C11 Standard .
, - .
FLT_ROUNDS
, , (, fesetround). FLT_ROUNDS .
ã® . , <math.h> . <math.h>
.
IEEE-754 F C11, (NaN ). , NaN , - . : IEEE 754 Standard , Annex F of the C11 Standard .
, - .
FLT_ROUNDS
, , (, fesetround). FLT_ROUNDS .
. , <math.h>
. <math.h>
.
IEEE-754 F C11, (NaN ). , NaN , - . : IEEE 754 Standard , Annex F of the C11 Standard .
, - .
FLT_ROUNDS
, , (, fesetround). FLT_ROUNDS .
<new>ããã³<new.h>
- æ°èŠããã³åé€
ã©ã€ãã©ãªã®ä»¥åã®ããŒãžã§ã³ã§ã¯ãå®è£
äŸåã®æŒç®ånewããã³deleteãåçã©ã€ãã©ãªïŒããšãã°ãmsvcr120.dllïŒãããšã¯ã¹ããŒããããŠããŸããã ãããã®æŒç®åã¯ãåçã©ã€ãã©ãªã䜿çšãããŠããå Žåã§ããåžžã«éçã«ãã€ããªãšãªã³ã¯ããããã«ãªããŸããã
ããã¯ããã€ãã£ãã³ãŒããŸãã¯æ··åã³ãŒãïŒ/ clrïŒã«ãšã£ãŠããã»ã©éèŠãªå€æŽã§ã¯ãããŸãããã / clrïŒpureãã©ã°ã䜿çšããŠã³ãŒããã³ã³ãã€ã«ãããšãã³ãŒãã®æŽæ°åŸã«ã³ã³ãã€ã«ã忢ããå ŽåããããŸãã ãã®å ŽåãããããŒãã¡ã€ã« <new.h> . : /clr:pure .
ãã¹ãŠé©åãªå Žæã«æ¥ç¶ãããŠããããšã確èªããå¿
èŠããããŸã <new.h>
. : /clr:pure .
<new.h>
. : /clr:pure .