如何正确地编写尾随返回类型

How do I properly write trailing return type?

本文关键字:返回类型 正确地      更新时间:2023-10-16

假设我有这个函数模板:

template<typename T1, typename T2>
auto DoSomething(const T1& arg);

当然,这个函数需要一个尾随返回类型,考虑到函数的目的,我真的不能正确的。

这个函数应该做的是使用arg,对argT2对象做一些操作,并使用该操作的结果作为函数的返回值。显然,DoSomething()的返回类型必须(兼容地)与对argT2对象所做的操作的返回类型匹配。

再次假设我们让DoSomething()做一些实际操作,比如乘法。然后我们将DoSomething()写成如下代码:

template<typename T1, typename T2>
auto DoSomething(const T1& arg) -> /* trailing return-type */ {
    T2 t2Obj;   // Or have it obtained in some other way
    return arg * t2Obj;
}

我应该如何形成尾随返回类型?


注:我试过使用decltype(arg * T2), decltype(T1 * T2)decltype(T1::operator * (T2))以及其他一些非常奇怪的decltype作为尾随返回类型。

您应该使用decltypestd::declval<>作为:

template<typename T1, typename T2>
auto DoSomething(const T1& arg) -> decltype(arg * std::declval<T2>())
{
    T2 t2Obj;   // Or have it obtained in some other way
    return arg * t2Obj;
}

因为T2可能没有默认构造函数,所以decltype(arg *T2())可能无法工作。

但是我也注意到,如果T2没有默认构造函数,那么也不能编写T2 t2Obj。所以如果要求 T2有默认构造函数,那么您可以简单地这样写:

-> decltype(arg *T2()) //requirement : T2 must have default constructor
如果要求 T2有默认构造函数,

应该也可以工作!