struct Point {
int x = 0;
int y = 10;
};
Point p = {1,};
p.x == 1; // true
p.y == 10; // is this true?
æ ¹æ®åˆå§‹åŒ–列表ä¸çš„æ ‡å‡†ç¼ºå¤±å…ƒç´ æ˜¯åˆå§‹åŒ–çš„å€¼ï¼Œå› æ¤y
应该是int()
或0
,但它似乎没有说明在éžé™æ€æ•°æ®æˆå‘˜åˆå§‹åŒ–程åºã€‚
ç¼–è¾‘ï¼šæ ¹æ®ç”æ¡ˆï¼Œæ˜¾ç„¶è¿™æ˜¯æ— æ•ˆçš„c ++ 11,我想知é“c ++ 1yä¸çš„情况。
ç”案 0 :(得分:13)
éžé™æ€æ•°æ®æˆå‘˜åˆå§‹åŒ–程åºï¼ˆNSDMI)ä¸å˜åœ¨;这个问题ä¸é€‚用。
首先,这ç§åˆå§‹åŒ–æ— æ•ˆï¼Œå› ä¸ºæ‚¨çš„ç±»åž‹ä¸æ˜¯èšåˆï¼š
 Â
[C++11: 8.5.1/1]:
汇总数组或 a class (第9æ¡ï¼‰ 用户æä¾›çš„æž„é€ å‡½æ•°ï¼ˆ12.1),对于éžé™æ€æ•°æ®æˆå‘˜ no brace-or-equal-initializers (9.2),没有ç§æœ‰æˆ–å—ä¿æŠ¤çš„éžé™æ€æ•°æ®æˆå‘˜ï¼ˆç¬¬11æ¡ï¼‰ï¼Œ   没有基类(第10æ¡ï¼‰ï¼Œä¹Ÿæ²¡æœ‰è™šå‡½æ•°ï¼ˆ10.3)。
å› æ¤ï¼Œæ— 法在æ¤å¤„执行èšåˆåˆå§‹åŒ–;采用std::initializer_list
çš„æž„é€ å‡½æ•°å°†æ˜¯æ‚¨ä½¿ç”¨è¯¥åˆå§‹åŒ–è¯æ³•ï¼ˆ[C++11: 8.5.4/3]
)的唯一方法,但您也没有其ä¸ä¸€ç§ã€‚
å› æ¤ï¼Œé—®é¢˜çš„整个å‰æ是有缺陷的:ä¸å¯èƒ½è®©è‡ªå·±è¿›å…¥è¿™ç§çŠ¶æ€ã€‚
在å³å°†æŽ¨å‡ºçš„æ ‡å‡†ç‰ˆæœ¬ä¸ï¼Œå·²ç»æ”¾å®½äº†èšåˆçš„定义,以å…许您的类型被视为èšåˆï¼ˆåªè¦è¿™ä¸¤ä¸ªæˆå‘˜éƒ½ä¿æŒpublic
ï¼ï¼‰ :
 Â
[n3936: 8.5.1/1]
èšåˆæ•°ç»„或类(第9æ¡ï¼‰ï¼Œæ²¡æœ‰ç”¨æˆ·æä¾›çš„æž„é€ å‡½æ•°ï¼ˆ12.1),没有ç§æœ‰æˆ–å—ä¿æŠ¤çš„éžé™æ€æ•°æ®æˆå‘˜ï¼ˆç¬¬11æ¡ï¼‰ï¼Œæ²¡æœ‰åŸºç±»ï¼ˆç¬¬10æ¡ï¼‰ï¼Œä¹Ÿæ²¡æœ‰è™šå‡½æ•°ï¼ˆ10.3)。
在æ¤ä¹‹åŽï¼Œæœ‰ä¸€æ¡è§„则å¯ä»¥ä¿è¯æ‚¨æ£åœ¨å¯»æ‰¾çš„结果:
 Â
[n3936: 8.5.1/7]
:如果列表ä¸çš„ initializer-clauses 少于èšåˆä¸çš„æˆå‘˜ï¼Œé‚£ä¹ˆæœªæ˜Žç¡®åˆå§‹åŒ–çš„æ¯ä¸ªæˆå‘˜éƒ½åº”从其大括å·ä¸åˆå§‹åŒ– - or-equal-initializer 或者,如果没有 brace-or-equal-initializer ,   从空的åˆå§‹åŒ–列表(8.5.4)。 [例如:   Âstruct S { int a; const char* b; int c; int d = b[a]; }; S ss = { 1, "asdf" };
使用
ss.a
åˆå§‹åŒ–1
,ss.b
"asdf"
,ss.c
åˆå§‹åŒ–int{}
å½¢å¼çš„表达å¼å€¼ï¼ˆå³ï¼Œ0
)和ss.d
,其值ss.b[ss.a]
(å³â€™s’
)和   Âstruct X { int i, j, k = 42; }; X a[] = { 1, 2, 3, 4, 5, 6 }; X b[2] = { { 1, 2, 3 }, { 4, 5, 6 } };
a
å’Œb
具有相åŒçš„值 -end example]
ç”案 1 :(得分:3)
(ç”案在C ++ 1yä¸æœ‰æ•ˆï¼Œä»…ï¼ï¼‰
æ ¹æ®â€œ8.5.1汇总â€ä¸€èŠ‚第7段(N3691工作è‰æ¡ˆæ—¥æœŸï¼š2013-05-16)
 Â7如果列表ä¸çš„initializer-clauseæ•°é‡å°‘于   èšåˆä¸çš„æˆå‘˜ï¼Œç„¶åŽæ¯ä¸ªæˆå‘˜æœªæ˜Žç¡®åˆå§‹åŒ–   应从其支撑或ç‰äºŽåˆå§‹åŒ–器åˆå§‹åŒ–ï¼Œæˆ–è€…å¦‚æžœæœ‰çš„è¯ Â Â ä»Žç©ºçš„åˆå§‹åŒ–列表ä¸ä¸æ˜¯å¤§æ‹¬å·æˆ–大å°å†™çš„   (8.5.4)。
在报价下é¢æœ‰ä¸€ä¸ªä¾‹å
[ Example: struct S { int a; const char* b; int c; int d = b[a]; };
S ss = { 1, "asdf" };
initializes ss.a with 1, ss.b with "asdf", ss.c
with the value of an expression of the form int{} (that is, 0), and
ss.d with the value of ss.b[ss.a] (that is, ’s’),
å› æ¤ï¼Œåœ¨æ‚¨çš„示例ä¸ï¼Œp.y将由10åˆå§‹åŒ–。