C++標準14.8.2 $ 7說:替代在模板參數推演中如何工作?
取代在所有類型和表達了在函數類型並在模板參數聲明使用發生。這些表達式不僅包括常量表達式,例如出現在數組邊界或非類型模板參數中的常量表達式,還包括
sizeof
,decltype
以及允許非常量表達式的其他上下文中的常規表達式(即非常量表達式)。替換按詞彙順序進行,並在遇到導致扣除失敗的條件時停止。 [注意:異常規範中的等價替換隻有在例外規範被實例化時才能完成,在這種情況下,如果替換導致無效類型或表達式,則程序不合格。 - 注完]
這裏的標準提供了一個例子:
template <class T> struct A { using X = typename T::X; };
template <class T> typename T::X f(typename A<T>::X);
template <class T> void f(...) { }
template <class T> auto g(typename A<T>::X) -> typename T::X;
template <class T> void g(...) { }
void h() {
f<int>(0); // OK, substituting return type causes deduction to fail
g<int>(0); // error, substituting parameter type instantiates A<int>
}
爲什麼叫g<int>(0)
是錯誤的嗎?尾隨返回類型T::X
是否導致替換失敗?模板功能f
和g
之間有什麼區別?
返回類型如何作爲函數簽名的一部分而不是參數? – Barry
@Barry我認爲返回類型和參數都被認爲是函數簽名的一部分 – Carousel
@Barry它們都是函數模板簽名的一部分,但我可能不應該在這裏使用「簽名」。 –