簡體   English   中英

SFINAE:“ static_cast <void> ()”或“,void()”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM