n3797说:
§7.1.6.4/ 14:
 Â使用å ä½ç¬¦ç±»åž‹çš„返回类型声明的函数   ä¸å¾—虚拟(10.3)。
å› æ¤ä»¥ä¸‹ç¨‹åºæ ¼å¼ä¸æ£ç¡®ï¼š
struct s
{
virtual auto foo()
{
}
};
我能找到的所有ç†ç”±éƒ½æ˜¯æ¥è‡ªn3638的这个模糊的å•è¡Œï¼š
 Â虚拟
   Âå¯ä»¥å…许虚拟的返回类型扣除   函数,但这会使é‡å†™æ£€æŸ¥å’Œvtableå¤æ‚化   布局,所以似乎最好ç¦æ¢è¿™ä¸ªã€‚
任何人都å¯ä»¥æ供进一æ¥çš„ç†ç”±æˆ–给出一个与上述引用一致的好(代ç )示例å—?
ç”案 0 :(得分:21)
您所包å«çš„基本原ç†ç›¸å½“清楚:自然,虚函数æ„味ç€è¢«åç±»è¦†ç›–ï¼Œå› æ¤æ‚¨ä½œä¸ºåŸºç±»çš„设计者应该尽å¯èƒ½åœ°è®©ç»§æ‰¿æ‚¨çš„类的人æä¾›åˆé€‚的覆盖。但是,如果使用auto
,找出覆盖的返回类型对于程åºå‘˜æ¥è¯´æ˜¯ä¸€é¡¹ç¹ç的任务。编译器的问题就少了,但人类会有很多机会感到困惑。
例如,如果您看到一个看起æ¥åƒè¿™æ ·çš„返回è¯å¥
return a * 3 + b;
您必须将程åºè¿½æº¯åˆ°a
å’Œb
的声明点,找出类型促销,并确定返回类型应该是什么。
似乎è¯è¨€è®¾è®¡è€…å‘现这会让人感到困惑,并决定ä¸å…许这个功能。
ç”案 1 :(得分:15)
嗯,函数的推导返回类型åªåœ¨å‡½æ•° definition çš„ä½ç½®çŸ¥é“:返回类型是从函数体内的return
è¯å¥ä¸æŽ¨å¯¼å‡ºæ¥çš„。
åŒæ—¶ï¼Œæž„建了vtable,并且完全基于类定义ä¸å˜åœ¨çš„函数声明æ¥æ£€æŸ¥è¦†ç›–è¯ä¹‰ã€‚这些检查从ä¸ä¾èµ–于函数定义,也从ä¸éœ€è¦æŸ¥çœ‹å®šä¹‰ã€‚例如,该è¯è¨€è¦æ±‚覆盖函数具有与其覆盖的函数相åŒçš„返回类型或åå˜è¿”回类型。当éžå®šä¹‰å‡½æ•°å£°æ˜ŽæŒ‡å®šæŽ¨å¯¼çš„返回类型(å³auto
没有尾éšè¿”回类型)时,其返回类型在æ¤æ—¶ä¸º unknown ,并且在编译器é‡åˆ°å®šä¹‰ä¹‹å‰ä¸€ç›´æœªçŸ¥ã€‚功能。当返回类型未知时,ä¸å¯èƒ½æ‰§è¡Œä¸Šè¿°è¿”回类型检查。è¦æ±‚编译器以æŸç§æ–¹å¼å°†è¿”回类型检查推迟到已知的ä½ç½®ï¼Œè¿™éœ€è¦å¯¹è¯è¨€è§„范的这个基本区域进行é‡å¤§çš„定性é‡æ–°è®¾è®¡ã€‚ (我ä¸ç¡®å®šå®ƒæ˜¯å¦å¯èƒ½ã€‚)
å¦ä¸€ç§é€‰æ‹©æ˜¯åœ¨ï¼ƒ34çš„å…¨é¢æŽˆæƒä¸‹å‡è½»ç¼–译器的负担;ä¸éœ€è¦è¯Šæ–"或者"行为未定义",å³å°†è´£ä»»äº¤ç»™ç”¨æˆ·ï¼Œä½†è¿™ä¹Ÿä¼šä¸Žä»¥å‰çš„è¯è¨€è®¾è®¡äº§ç”Ÿé‡å¤§å差。
基本上,由于æŸç§ç±»ä¼¼çš„åŽŸå› ï¼Œæ‚¨æ— æ³•å°†&
è¿ç®—符应用于声明为auto f();
但尚未定义的函数,如7.1.6.3/11ä¸çš„示例所示。