“过早â€çš„ç ´å是å¦å¯èƒ½ï¼Ÿ

时间:2013-11-05 14:01:52

标签: c++ destructor raii object-lifetime

result_t work(resource_t& resource) {
    lock_t ___(resource);

    return work_impl(resource);
}

是å¦ä¿è¯___çš„æžæž„函数会在work_impl()返回åŽè¢«è°ƒç”¨ï¼Ÿæˆ–者编译器在调用___之å‰å¯ä»¥è‡ªç”±åœ°é”€æ¯work_impl()å—?

4 个答案:

答案 0 :(得分:4)

将执行表达å¼work_impl(resource),结果将被å¤åˆ¶åˆ°è°ƒç”¨è€…端或用作临时。然åŽï¼Œå¯¹è±¡___将被破å。

å¦ä¸€æ–¹é¢ï¼Œè¯·å‹¿ä½¿ç”¨__或___作为任何标识符的å‰ç¼€ã€‚它们是为编译器ä¿ç•™çš„。

答案 1 :(得分:2)

如果æžæž„函数是éžå¹³å‡¡çš„,则å¯èƒ½æ— æ³•è°ƒç”¨å®ƒ 过早地,åªè¦å…¶ä½™ä»£ç æ˜¯æ­£ç¡®çš„。在 未定义行为的情况(例如,带有两个或的å˜é‡å称) 更接近_),当然,没有任何ä¿è¯ã€‚

答案 2 :(得分:1)

如果没有办法区分,编译器å¯ä»¥è‡ªç”±åœ°åšä»»ä½•äº‹æƒ…。但是如果æžæž„函数具有一些程åºå¯è§çš„效果,它将始终在work_impl返回åŽå‘生。

答案 3 :(得分:1)

此程åºçš„行为实际上是未定义,标识符 __是ä¿ç•™ï¼Œæˆ‘们å¯ä»¥ä»Žè‰æ¡ˆC ++中看到标准17.6.4.3 ä¿ç•™å称段 2 说:

  

如果程åºåœ¨ä¿ç•™å®ƒçš„上下文中声明或定义å称,除了本æ¡æ¬¾æ˜Žç¡®å…许的å称外,其行为是未定义的。

如果我们进一步查看17.6.4.3.2 部分部分,请说明:

  

包å«åŒä¸‹åˆ’线_ _或以下划线åŽè·Ÿå¤§å†™å­—æ¯ï¼ˆ2.12)开头的æ¯ä¸ªå称都ä¿ç•™ç»™å®žçŽ°ä»¥ä¾›ä»»ä½•ä½¿ç”¨ã€‚

因此,除éžç¼–译器文档__å¯ç”±ç”¨æˆ·ä»£ç å…费使用,å¦åˆ™ä¿ç•™ã€‚

  

éšå¼è°ƒç”¨æžæž„函数

因此,如果此程åºæœªè°ƒç”¨undefined behavior,那么éšå¼è°ƒç”¨çš„æžæž„函数的规则å¯ä»¥ä»Žæ ‡å‡†è‰æ¡ˆéƒ¨åˆ†12.4 Destructotrs 段 11 表示(强调我的)

  
    

- 对于在程åºç»ˆæ­¢æ—¶å…·æœ‰é™æ€å­˜å‚¨æŒç»­æ—¶é—´ï¼ˆ3.7.1)的构造对象(3.6.3),

         

- 对于在线程退出处具有线程存储æŒç»­æ—¶é—´ï¼ˆ3.7.2)的构造对象,

         

- 对于具有自动存储æŒç»­æ—¶é—´ï¼ˆ3.7.3)的构造对象,当创建对象的å—退出时(6.7),

         

- 对于临时对象的生命周期结æŸæ—¶æž„造的临时对象(12.2),

  

è¿™æ„味ç€é€€å‡ºwork()时将调用自动对象的æžæž„函数,这必须在返回结果åŽå‘生。我们å¯ä»¥è¿›ä¸€æ­¥çœ‹åˆ°ï¼Œå¯¹è±¡çš„销æ¯é¡ºåºä¹Ÿæ˜¯ä»Ž6.6 跳转语å¥ä¸­æŒ‡å®šçš„:

  

退出范围(无论多么已完æˆï¼‰æ—¶ï¼Œåœ¨è¯¥èŒƒå›´å†…构建的具有自动存储æŒç»­æ—¶é—´ï¼ˆ3.7.3)的对象将按其构造的相å顺åºé”€æ¯ã€‚ [注:对于临时学生,è§12.2。 - åŽæ³¨]

请注æ„,包å«åŒä¸‹åˆ’线__çš„å称,或以下划线åŽè·Ÿå¤§å†™å­—æ¯å¼€å¤´çš„å称为reserved in any scope。