åæå
夿°ã®åæåã¯æ§ç¯æã«ãã®åæå¤ãæä¾ãã¾ãã
åæå¤ã¯å®£è¨åã¾ã㯠new å¼ã®åæååç¯ã§æä¾ãããã¨ãã§ãã¾ãã ã¾ã颿°å¼ã³åºãã§ãè¡ããã¾ãã 颿°ã®å¼æ°ããã³é¢æ°ã®æ»ãå¤ãåæåããã¾ãã
ããããã®å®£è¨åã«å¯¾ãã¦ã以ä¸ã®ããããã®åæååãæå®ã§ãã¾ãã
( expression-list )
|
(1) | ||||||||
= expression
|
(2) | ||||||||
{ initializer-list }
|
(3) | ||||||||
æèã«ãã£ã¦ãåæååã¯ä»¥ä¸ãçºçããã¾ãã
- å¤åæåãä¾ãã° std::string s{};
- ç´æ¥åæåãä¾ãã° std::string s("hello");
- ã³ãã¼åæåãä¾ãã° std::string s = "hello";
- ãªã¹ãåæåãä¾ãã° std::string s{'a', 'b', 'c'};
- éæä½åæåãä¾ãã° char a[3] = {'a', 'b'};
- åç §åæåãä¾ãã° char& c = a[0];
åæååãæä¾ãããªãå ´åã¯ãããã©ã«ãåæåã®ã«ã¼ã«ãé©ç¨ããã¾ãã
ç®æ¬¡ |
[ç·¨é] éãã¼ã«ã«å¤æ°
éçè¨æ¶åæéãæã¤ãã¹ã¦ã®éãã¼ã«ã«å¤æ°ã¯ã main 颿°ã®å®è¡ãå§ã¾ãåã«ãããã°ã©ã ã®ã¹ã¿ã¼ãã¢ããã®ä¸é¨ã¨ãã¦åæåããã¾ã (é å»¶ããã¦ããå ´åã¯é¤ãã¾ã (å¾è¿°))ã ã¹ã¬ãããã¼ã«ã«è¨æ¶åæéãæã¤ãã¹ã¦ã®éãã¼ã«ã«å¤æ°ã¯ãã¹ã¬ããã®é¢æ°ã®å®è¡ã®éå§ã«å¯¾ãã¦å è¡é åããããã¹ã¬ããèµ·åå¦çã®ä¸é¨ã¨ãã¦åæåããã¾ãã ãããã®å¤æ°ã®è¨æ¶åã¯ã©ã¹ã«ã¤ãã¦ãåæåã¯2ã¤ã®å¥ã ã®ã¹ãã¼ã¸ã§çºçãã¾ãã
[ç·¨é] éçåæå
.bss
ã»ã°ã¡ã³ãã«é
ç½®ããã¾ãã ããã¯ãã£ã¹ã¯ä¸ã®ã¹ãã¼ã¹ãå ãããããã°ã©ã ã®ãã¼ãæã« OS ã«ãã£ã¦ã¼ãåæåããã¾ãã[ç·¨é] åçåæå
ãã¹ã¦ã®éçåæåã®å®äºå¾ãéãã¼ã«ã«å¤æ°ã®åçåæåã以ä¸ã®ç¶æ³ã§çºçãã¾ãã
2) é¨åçé åºä»ãåçåæåã æé»ã«ã¾ãã¯æç¤ºçã«å®ä½åãããç¹æ®åã§ãªããã¹ã¦ã®ã¤ã³ã©ã¤ã³å¤æ°ã«é©ç¨ããã¾ãã é¨åçé åºä»ãã® V ããã¹ã¦ã®ç¿»è¨³åä½ã«ããã¦é åºä»ãã¾ãã¯é¨åçé åºä»ãã® W ããåã®å ´åã V ã®åæå㯠W ã®åæåã«å¯¾ãã¦å
è¡é
åããã¾ã (ã¾ãã¯ãããã°ã©ã ãã¹ã¬ãããéå§ããå ´åã¯å
è¡çºçãã¾ã)ã
|
(C++17以ä¸) |
éçããã³ã¹ã¬ããè¨æ¶åæéãæã¤éãã¼ã«ã«å¤æ°ã®åæåãä¾å¤ã«ãã£ã¦çµäºããå ´åã¯ã std::terminate ãå¼ã°ãã¾ãã
[ç·¨é] æ©æåçåæå
以ä¸ã®æ¡ä»¶ãã©ã¡ããçã®å ´åãã³ã³ãã¤ã©ã¯éçåæåã®ä¸é¨ã¨ã㦠(æ¬è³ªçã«ã³ã³ãã¤ã«æã«) åçåæåããã夿°ãåæåãããã¨ã許ããã¦ãã¾ãã
ä¸è¨ã®ã«ã¼ã«ã®ãããä½ããã®ãªãã¸ã§ã¯ã o1
ã®åæåãåå空éã¹ã³ã¼ãã®ãªãã¸ã§ã¯ã o2
ãåç
§ãã o2
ãåçåæåãè¦æ±ãããããããªãããã©ããåã翻訳åä½å
ã§å¾ã«å®ç¾©ããã¦ããå ´åã使ç¨ããã o2
ã®å¤ããå®å
¨ã«åæåããã o2
ã®å¤ã«ãªã (ã³ã³ãã¤ã©ã o2
ã®åæåãã³ã³ãã¤ã«æã«ææ ¼ãããã) ããã¼ãåæåãããã ãã® o2
ã®å¤ã«ãªããã¯ãæªè¦å®ã§ãã
inline double fd() { return 1.0; } extern double d1; double d2 = d1; // æªè¦å®ã // d1 ãåçåæåãããå ´å㯠0.0 ã«åçåæåããã // d1 ãéçåæåãããå ´å㯠1.0 ã«åçåæåããã // ã¾ã㯠0.0 ã«éçåæåããã¾ã (両æ¹ã®å¤æ°ãåçåæåãããã° // ãã®å¤ã«ãªãã§ããããã)ã double d1 = fd(); // 1.0 ã«éçã¾ãã¯åçåæåããã¾ãã
[ç·¨é] é å»¶åçåæå
åçåæåã main 颿° (éç夿°ã®å ´å) ã¾ãã¯ã¹ã¬ããã®åæé¢æ° (ã¹ã¬ãããã¼ã«ã«å¤æ°ã®å ´å) ã®æåã®æã«å¯¾ãã¦å è¡çºçããããé å»¶ããã¦å¾ç¶çºçãããã¯ãå¦çç³»å®ç¾©ã§ãã
éã¤ã³ã©ã¤ã³ (C++17以ä¸)夿°ã®åæåãé å»¶ãã㦠main 颿°ã¾ãã¯ã¹ã¬ãã颿°ã®æåã®æã«å¯¾ãã¦å¾ç¶çºçããå ´åãããã¯å¤æ°ãåæåãããã®ã¨åã翻訳åä½å ã§å®ç¾©ãããéçã¾ãã¯ã¹ã¬ãããã¼ã«ã«è¨æ¶åæéãæã¤ä»»æã®å¤æ°ã®æåã® ODR 使ç¨ã«å¯¾ãã¦å è¡çºçãã¾ãã ãã翻訳åä½å ãã ODR 使ç¨ããã夿°ã颿°ããªãå ´åããã®ç¿»è¨³åä½å ã§å®ç¾©ãããéãã¼ã«ã«å¤æ°ã¯åæåããããã¨ããªãããããã¾ãã (ããã¯ãªã³ããã³ããªåçã©ã¤ãã©ãªã®åä½ãã¢ãã«åãã¾ã)ã ãããããã®ç¿»è¨³åä½ããä½ãã ODR 使ç¨ãããéããåæåã¾ãã¯ç ´æ£ãå¯ä½ç¨ãæã¤ãã¹ã¦ã®éãã¼ã«ã«å¤æ°ã¯ãããããããã°ã©ã å ã§ä½¿ç¨ãããªãã¦ããåæåããã¾ãã
ã¤ã³ã©ã¤ã³å¤æ°ã®åæåãé å»¶ãããå ´åãããã¯ãã®ç¹å®ã®å¤æ°ã®æåã® ODR 使ç¨ã«å¯¾ãã¦å è¡çºçãã¾ãã |
(C++17以ä¸) |
// ã¼ ãã¡ã¤ã«1 ã¼ #include "a.h" #include "b.h" B b; A::A(){ b.Use(); } // ã¼ ãã¡ã¤ã«2 ã¼ #include "a.h" A a; // ã¼ ãã¡ã¤ã«3 ã¼ #include "a.h" #include "b.h" extern A a; extern B b; int main() { a.Use(); b.Use(); } // main ã«å ¥ãåã« a ãåæåãããå ´åã A::A() ãããã使ç¨ããæç¹ã§ã¯ // b ã¯ã¾ã åæåããã¦ããªãå¯è½æ§ãããã¾ã (åçåæåã¯ç¿»è¨³åä½éã§ã¯ä¸å®ã«é åããããã)ã // main ã®æåã®æ (ãã¡ã¤ã«1ã§å®ç¾©ããã颿°ã ODR 使ç¨ããåçåæåã®å®è¡ãå¼·å¶ããã¾ã) ã®å¾ã® // ããããã®æç¹ã§ a ãåæåãããå ´åã b 㯠A::A ã§ä½¿ç¨ãããåã«åæåããã¾ãã
[ç·¨é] éçãã¼ã«ã«å¤æ°
ãã¼ã«ã«ãª (ã¤ã¾ããããã¯ã¹ã³ã¼ãã®) éçããã³ã¹ã¬ãããã¼ã«ã«å¤æ°ã®åæåã«ã¤ãã¦ã¯ãéçãã¼ã«ã«å¤æ°ãåç §ãã¦ãã ããã
[ç·¨é] ã¯ã©ã¹ã¡ã³ã
ééçãã¼ã¿ã¡ã³ãã¯ã¡ã³ãåæååãªã¹ãã¾ã㯠ããã©ã«ãã¡ã³ãåæååã§åæåã§ãã¾ãã
[ç·¨é] ãã¼ã
éãã¼ã«ã«å¤æ°ã®ç ´æ£ã®é åºã¯ std::exit ã§èª¬æããã¾ãã
[ç·¨é] æ¬ é¥å ±å
以ä¸ã®åä½å¤æ´æ¬ é¥å ±åã¯ä»¥åã«çºè¡ããã C++ æ¨æºã«é¡ã£ã¦é©ç¨ããã¾ããã
DR | é©ç¨å | çºè¡æã®åä½ | æ£ããåä½ |
---|---|---|---|
CWG 2026 | C++14 | zero-init was specified to always occur first, even before constant-init | no zero-init if constant init applies |
[ç·¨é] é¢é£é ç®
åæå ã® Cè¨èªãªãã¡ã¬ã³ã¹
|