你觉得哪个更好?
template <typename T> void func(T x,T y) {}
或
template <typename T> void func(T x,decltype(x) y) {}
恕我直言,第二种形式似乎更可取,因为x和y类型之间的链接是显式的,至少在重命名模板标识符时,事情看起来不那么容易出错。
修改
第二种形式允许您使用第一个参数的一个子类型调用该函数,而第一个表单需要完全相同的类型。这个论点似乎比前一个好一点。
答案 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。