關(guān)于C++中使用CRTP遇到 void value not ignored as it ought to be 錯(cuò)誤的疑難解答
????出現(xiàn) void value not ignored as it ought to be 錯(cuò)誤是因?yàn)楹瘮?shù)返回值為 void 類型,而你對(duì)這個(gè) void 類型的“返回值”進(jìn)行了操作(包括賦值、強(qiáng)制轉(zhuǎn)換、運(yùn)算等),通常人們說(shuō)出現(xiàn)這個(gè)錯(cuò)誤是因?yàn)槟憬o某個(gè)變量賦值了 void 返回類型的函數(shù)值,例如:
void func()
{}
int i = func()
由于 func() 返回值類型為 void ,因此 func() 不能賦值給任何變量,否則編譯器會(huì)報(bào)錯(cuò) void value not ignored as it ought to be 。
????但在實(shí)踐中這個(gè)錯(cuò)誤可能不是以這樣明顯的方式出現(xiàn),近日我在使用CRTP時(shí)候,發(fā)現(xiàn)如下代碼會(huì)報(bào)錯(cuò) void value not ignored as it ought to be

仔細(xì)一看好像沒(méi)有什么問(wèn)題,但編譯時(shí)會(huì)報(bào)錯(cuò)?void value not ignored as it ought to be ,這個(gè)問(wèn)題困擾了我很久,后來(lái)我發(fā)現(xiàn)可能是因?yàn)檫\(yùn)算優(yōu)先級(jí)導(dǎo)致的,即上面的代碼實(shí)際被解釋為
(Derived*)(?this->initialize() );
即先調(diào)用 this->initialize() ,然將其返回的 void 強(qiáng)制轉(zhuǎn)換為 Derived* 指針,很顯然這是在對(duì) void 進(jìn)行強(qiáng)制轉(zhuǎn)換,是錯(cuò)誤的,正確的寫(xiě)法應(yīng)該是

此時(shí)編譯器將通過(guò)編譯。
????但還有一個(gè)比較疑惑的問(wèn)題是,下面的代碼沒(méi)有將 (Derived*)this 括起來(lái),但是卻成功通過(guò)編譯并運(yùn)行了,我還不知道為什么,希望有知道的朋友可以在評(píng)論區(qū)解惑,感激不盡!

????總的來(lái)說(shuō)為了安全起見(jiàn),最好是寫(xiě)成 ((Derived*)this)->initialize();?的形式,這個(gè)括號(hào)不加有可能不報(bào)錯(cuò)也有可能報(bào)?void value not ignored as it ought to be?,但多加個(gè)括號(hào)一定不會(huì)出錯(cuò)。