模板函数参数类型中的模板标识符与decltype

时间:2017-06-20 11:30:14

标签: c++ c++11 templates decltype

你觉得哪个更好?

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

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

恕我直言,第二种形式似乎更可取,因为x和y类型之间的链接是显式的,至少在重命名模板标识符时,事情看起来不那么容易出错。

修改

第二种形式允许您使用第一个参数的一个子类型调用该函数,而第一个表单需要完全相同的类型。这个论点似乎比前一个好一点。

2 个答案:

答案 0 :(得分: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环境中,它可能导致不同的编译时行为(不一定是编译错误),并且这两个选项可以间接编译到不同的程序。

答案 1 :(得分:2)

两种形式并不意味着完全相同。第二个是非推断的。

第一个也不允许对其中一个参数进行隐式转换(不仅仅是子类型),因为它不能将预期类型(比如int)与要转换的类型统一起来(让我们说float):See on coliru