簡體   English   中英

這是在C ++ 03中執行“ Expression SFINAE”的有效方法嗎?

[英]Is this a valid way of performing “Expression SFINAE” in C++03?

在C ++ 11中,通過SFINAE可以很容易地確定表達式是否有效。 舉個例子,想象一下檢查某些東西是否可流式傳輸:

template <typename T>
auto print_if_possible(std::ostream& os, const T& x) 
    -> decltype(os << x, void());

如果os << x是格式正確的表達式,則print_if_possible將僅參與重載解析

Godbolt.org上的實時示例


我需要在C ++ 03中執行相同的操作,並且我發現sizeof可以有所幫助(因為我需要表達式的未評估上下文)。 這是我想出的:

template <int> struct sfinaer { };

template <typename T>
void print_if_possible(std::ostream& os, const T& x, 
    sfinaer<sizeof(os << x)>* = NULL);

Godbolt.org上的實時示例


似乎最新版本的g ++clang ++都接受帶有-std=c++03 -Wall -Wextrasizeof版本。

  • 該代碼是否保證可以按C ++ 03的預期運行?

  • 是否可以得出結論,可以使用sfinaersizeof將C ++ 11表達式SFINAE的任何用法sfinaer移植到C ++ 03?

表達式SFINAE有點灰色。 C ++ 03對此基本上什么也沒說。 它既沒有明確禁止它,也沒有明確允許它。 當代的實現不允許這種構造,因為它造成了很大的實現復雜性,並且尚不清楚是否應允許這種構造,並且CWG 最終將其轉向之前, 一度傾向於禁止它(請參閱2003年4月的說明)。已添加到C ++ 11的decltypeconstexpr (請參閱N2634的簡介)。

在CWG開始明確標記要追溯解決的問題的災難恢復狀態之前,這一切都發生了。

我認為這里最好的建議就是“詢問您的編譯器供應商”。 在C ++ 11模式下支持表達式SFINAE的編譯器不太可能會放棄在C ++ 03模式下的支持(供應商可能會將CWG 339視為缺陷報告並追溯應用,或將其視為擴展)。 OTOH,一個從來不支持C ++ 11的編譯器,不太可能投入使SFINAE正常工作所必需的大量成本(實際上,直到最近,它才在某些主要的編譯器咳嗽中工作)。 我還懷疑一個仍然使用15年語言的地方不太可能使用這種支持所必需的現代工具鏈。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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