通過使用Expression SFINAE,您可以檢測是否支持某些operator或operation。是否執行了decltype內部的表達式,還是僅僅進行了驗證檢查?
例如,
template <class T>
auto f(T& t, size_t n) -> decltype(t.reserve(n), void())
{ t.reserve(n); }
我的問題是,t.reserve(n)
內decltype
得到執行與否?
如果是的話,是不是意味着t.reserve(n)
被執行了兩次,一個在decltype
之內,另一個在函數體內?
如果不是,是否僅在編譯期間檢查驗證過程?但爲什麼它沒有執行,我認爲逗號分隔的表達式列表中的所有表達式都會被執行。
它沒有執行沒有。 (你可以通過在其中放置一個斷點並調用f來驗證) – Borgleader
'decltype'是一個*未評估的操作數*。內部表達式不會被執行,因爲只有它們產生的類型是需要的。如果表達式格式不正確,那麼您的替換失敗(在這種情況下)。 – 0x499602D2
我不太相信'void()'是合法的。 –