部分èšåˆåˆå§‹åŒ–å’Œéžé™æ€æ•°æ®æˆå‘˜åˆå§‹åŒ–程åº

时间:2014-06-04 17:12:56

标签: c++ c++11 c++14

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中的情况。

2 个答案:

答案 0 :(得分:13)

C ++ 98,C ++ 03

éžé™æ€æ•°æ®æˆå‘˜åˆå§‹åŒ–程åºï¼ˆNSDMI)ä¸å­˜åœ¨;这个问题ä¸é€‚用。


C ++ 11

首先,这ç§åˆå§‹åŒ–无效,因为您的类型ä¸æ˜¯èšåˆï¼š

  

[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])的唯一方法,但您也没有其中一ç§ã€‚

因此,问题的整个å‰æ是有缺陷的:ä¸å¯èƒ½è®©è‡ªå·±è¿›å…¥è¿™ç§çŠ¶æ€ã€‚


C ++ 1Y

在å³å°†æŽ¨å‡ºçš„标准版本中,已ç»æ”¾å®½äº†èšåˆçš„定义,以å…许您的类型被视为èšåˆï¼ˆåªè¦è¿™ä¸¤ä¸ªæˆå‘˜éƒ½ä¿æŒ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åˆå§‹åŒ–。