为什么虚函数ä¸èƒ½ä½¿ç”¨è¿”回类型推导?

时间:2014-10-09 00:55:27

标签: c++ c++14 auto virtual-functions vtable

n3797说:

§7.1.6.4/ 14:

  

使用å ä½ç¬¦ç±»åž‹çš„返回类型声明的函数   ä¸å¾—虚拟(10.3)。

因此以下程åºæ ¼å¼ä¸æ­£ç¡®ï¼š

struct s
{
    virtual auto foo()
    {
    }
};

我能找到的所有ç†ç”±éƒ½æ˜¯æ¥è‡ªn3638的这个模糊的å•è¡Œï¼š

  

虚拟

     

å¯ä»¥å…许虚拟的返回类型扣除   函数,但这会使é‡å†™æ£€æŸ¥å’Œvtableå¤æ‚化   布局,所以似乎最好ç¦æ­¢è¿™ä¸ªã€‚

任何人都å¯ä»¥æ供进一步的ç†ç”±æˆ–给出一个与上述引用一致的好(代ç ï¼‰ç¤ºä¾‹å—?

2 个答案:

答案 0 :(得分:21)

您所包å«çš„基本原ç†ç›¸å½“清楚:自然,虚函数æ„味ç€è¢«å­ç±»è¦†ç›–,因此您作为基类的设计者应该尽å¯èƒ½åœ°è®©ç»§æ‰¿æ‚¨çš„类的人æä¾›åˆé€‚的覆盖。但是,如果使用auto,找出覆盖的返回类型对于程åºå‘˜æ¥è¯´æ˜¯ä¸€é¡¹ç¹ç的任务。编译器的问题就少了,但人类会有很多机会感到困惑。

例如,如果您看到一个看起æ¥åƒè¿™æ ·çš„返回语å¥

return a * 3 + b;

您必须将程åºè¿½æº¯åˆ°aå’Œb的声明点,找出类型促销,并确定返回类型应该是什么。

似乎语言设计者å‘现这会让人感到困惑,并决定ä¸å…许这个功能。

答案 1 :(得分:15)

嗯,函数的推导返回类型åªåœ¨å‡½æ•° definition çš„ä½ç½®çŸ¥é“:返回类型是从函数体内的return语å¥ä¸­æŽ¨å¯¼å‡ºæ¥çš„。

åŒæ—¶ï¼Œæž„建了vtable,并且完全基于类定义中存在的函数声明æ¥æ£€æŸ¥è¦†ç›–语义。这些检查从ä¸ä¾èµ–于函数定义,也从ä¸éœ€è¦æŸ¥çœ‹å®šä¹‰ã€‚例如,该语言è¦æ±‚覆盖函数具有与其覆盖的函数相åŒçš„返回类型或åå˜è¿”回类型。当éžå®šä¹‰å‡½æ•°å£°æ˜ŽæŒ‡å®šæŽ¨å¯¼çš„返回类型(å³auto没有尾éšè¿”回类型)时,其返回类型在此时为 unknown ,并且在编译器é‡åˆ°å®šä¹‰ä¹‹å‰ä¸€ç›´æœªçŸ¥ã€‚功能。当返回类型未知时,ä¸å¯èƒ½æ‰§è¡Œä¸Šè¿°è¿”回类型检查。è¦æ±‚编译器以æŸç§æ–¹å¼å°†è¿”回类型检查推迟到已知的ä½ç½®ï¼Œè¿™éœ€è¦å¯¹è¯­è¨€è§„范的这个基本区域进行é‡å¤§çš„定性é‡æ–°è®¾è®¡ã€‚ (我ä¸ç¡®å®šå®ƒæ˜¯å¦å¯èƒ½ã€‚)

å¦ä¸€ç§é€‰æ‹©æ˜¯åœ¨ï¼ƒ34çš„å…¨é¢æŽˆæƒä¸‹å‡è½»ç¼–译器的负担;ä¸éœ€è¦è¯Šæ–­ï¼†ï¼ƒ34;或者"行为未定义",å³å°†è´£ä»»äº¤ç»™ç”¨æˆ·ï¼Œä½†è¿™ä¹Ÿä¼šä¸Žä»¥å‰çš„语言设计产生é‡å¤§å差。

基本上,由于æŸç§ç±»ä¼¼çš„原因,您无法将&è¿ç®—符应用于声明为auto f();但尚未定义的函数,如7.1.6.3/11中的示例所示。