2017-06-20 83 views
4

您認爲哪種更好?模板標識符vs模板函數參數類型中的decltype

template <typename T> void func(T x,T y) {} 

template <typename T> void func(T x,decltype(x) y) {} 

IMHO,第二形式似乎優選的,因爲在類型x和y之間的聯繫是明確的,並且至少當重命名模板標識符的東西,看起來容易出錯較少。

編輯

第二種形式讓你打電話與一個使用第一個參數的子類型的功能,而第一種形式需要完全相同的類型。這個論點似乎比前一個稍好。

+2

第二種形式也似乎不必要的混淆。 – DeiDei

+1

我沒有真正得到'decltype'替代方案的用例。謹慎地闡述你爲什麼要這樣的事情? –

+0

第二種形式不會爲'y'啓用隱式轉換,而第一種形式不會? – Quentin

回答

3

它們在語義上是不同的,所以它取決於你想要達到的目標。第二個比第一個更具限制性。試想一下:

template <typename T> void func1(T x, decltype(x) y) {} 
template <typename T> void func2(T x, T y) {} 

func1(2., 4); // converts 4 to double 
func2(2., 4); // fails to compile 

在SFINAE場景中,它可能會導致不同的編譯時的行爲(不necessarely編譯錯誤),這兩個選項可以間接編譯成不同的程序。

2

兩種形式並不意味着正好相同。第二個是不推導的。

第一個也不允許在其中一個參數上進行隱式轉換(不僅是子類型),因爲那樣它將無法將預期類型(如int)與要轉換的類型(比如說float):See on coliru