2015-08-26 39 views
3

通過使用Expression SFINAE,您可以檢測是否支持某些operatoroperation是否執行了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之內,另一個在函數體內?

如果不是,是否僅在編譯期間檢查驗證過程?但爲什麼它沒有執行,我認爲逗號分隔的表達式列表中的所有表達式都會被執行。

+0

它沒有執行沒有。 (你可以通過在其中放置一個斷點並調用f來驗證) – Borgleader

+1

'decltype'是一個*未評估的操作數*。內部表達式不會被執行,因爲只有它們產生的類型是需要的。如果表達式格式不正確,那麼您的替換失敗(在這種情況下)。 – 0x499602D2

+0

我不太相信'void()'是合法的。 –

回答

11

否,從[dcl.type.simple]:

decltype說明符的操作數是一個未計算的操作數(第5章)。

這意味着,從[EXPR]:

在一些上下文中,未計算的操作數出現(5.2.8,5.3.3,5.3.7,7.1.6.2)。未評估的操作數不是 評估。未評估的操作數被認爲是全表達式

所以在這個特定的上下文中,decltype(t.reserve(n), void())的目的是驗證t.reserve(n)是一個有效的表達式。如果是的話,那麼函數是一個可行的重載,其返回類型是無效的,並且reserve()只會被調用一次(在函數體中)。如果不是,那麼我們有一個替代失敗,這個功能不是一個可行的過載候選。

+0

我看,謝謝。我只是覺得C++總是讓我感到驚訝,並不知道我怎麼會提前知道這些東西。 – Allanqunzi

+6

@Allanqunzi沒有人提前知道東西。每個人在某個時候都不知道。 – Barry

相關問題