2017-06-20 90 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