考慮這個函數模板:扣除類型後,函數模板中的替換順序是否有保證?
template<typename T>
typename soft_error<T>::type foo(T, typename hard_error<T>::type)
{ }
從調用foo()
的第一個參數的類型推斷類型T
後,編譯器會進行替代T
和實例函數簽名。
如果首先執行替換返回類型,導致簡單替換失敗,則編譯器將在計算重載集合並搜索其他可行超載(SFINAE)時放棄此函數模板。另一方面,如果第一個函數參數的替換先發生,導致硬錯誤(例如,由於非直接上下文中的替換失敗),則整個編譯將失敗。
問題:對函數參數和返回類型進行替換的順序是否有保證?
注:This example似乎表明,在所有主要的編譯器(VC11是單獨測試,並給了相同的結果)取代的返回類型替代參數類型之前發生。
請注意,[遲到指定返回類型會改變事物](http://liveworkspace.org/code/4cvdpz%2464)。 – 2013-03-17 15:29:19
@NicolBolas:對,這是因爲替代實際上是要按照詞彙順序發生 - 順便說一句Xeo正確地指出,這不是現行標準規定的行爲,所以我更正了我的答案 – 2013-03-17 15:33:09