[英]SFINAE: 'static_cast<void>()' or ', void()'?
在對任意類型執行SFINAE時,通常需要將表達式的結果強制轉換為void
。 我已經看到了兩種方法來做到這一點; 投向虛空:
(void)(expr) // or static_cast<void>(expr)
或者,或者將逗號運算符與無效prvalue RHS結合使用:
(expr), void()
我的理解是,在兩種情況下都對expr
進行了評估(在未評估的情況下為良好的格式),而結果(或在未評估的情況下為結果類型)都被丟棄了; 在任何情況下,即使是病理類T
無法覆蓋T::operator void()
或operator,(T, void)
。 (請參閱: 為什么不使用強制轉換語法調用“運算符void” ? , “自動f(參數)-> decltype(...,void())”中的“ void()”有什么作用? )。
就是說,這兩個習慣用法是等效的,還是在任何情況下都應該優先使用另一個(可能是非標准編譯器)? 如果不是,是否有任何理由(例如,可理解性)偏愛另一個?
它們都滿足所需的要求:
expr
作為舍棄值表達式有效, 僅此而已 。 void
類型(用於尾隨返回類型或部分專業化 ) 因此,在考慮上述標准時,這些方法是等效的。 記住這一點,我建議您使用代碼中更簡潔的內容。 但是無論您選擇什么,都必須堅持下去以保持一致性。
也可以使用一種功能樣式轉換,因為在只有一個參數的情況下,按定義它等同於顯式轉換符號-即
auto g(auto f) -> decltype(void( f(1, 2, 3) ));
也可以。
區別基本上是風格上的。
在某些情況下,由於逗號運算符的優先級較低,因此void()
形式可以避免使用多余的一對括號。 例如, foo + bar, void()
可以很好地工作,但是(void) (foo + bar)
(或等效的功能樣式轉換)將需要用括號括住整個表達式。
在其他情況下,使用(void)
強制轉換可能更簡潔。 例如,要防止++it1, ++it2, ++it3
逗號過載,可以使用一個(void)
++it1, (void) ++it2, ++it3
- ++it1, (void) ++it2, ++it3
,但要使用void()
將需要編寫兩次: ++it1, void(), ++it2, void(), ++it3
。
強制轉換為空,因為逗號可以重載。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.