例如,简单的身份仿函数:
template <typename T>
class identity
{
public:
constexpr auto operator ()(T && i) -> decltype(std::forward<T>(i))
{
return std::forward<T>(i);
}
};
什么是更好的(C ++ 14和更新)的返回值:
-> decltype(std::forward<T>(i))
或-> decltype(auto)
或者他们是一样的吗?
或者他们是一样的吗?
假设你写得正确:
constexpr decltype(auto) operator ()(T && i)
{
return std::forward<T>(i);
}
他们是一样的。 [dcl.type.auto.deduct]:
包含占位符类型的类型
T
和相应的初始化器e
确定如下:
- 对于在使用包含占位符类型的返回类型声明的函数中发生的非废弃返回语句,
T
是声明的返回类型,e
是return语句的操作数。如果return语句没有操作数,那么e
就是void()
;如果占位符是
decltype(auto)
类型说明符,则T
应仅为占位符。T
推导出的类型如[dcl.type.simple]所述确定,好像e
一直是decltype
的操作数。
函数的返回类型是从return e;
推导出来的,就像decltype(e)
一样。所以它与明确的decltype(std::forward<T>(i))
相同。
什么是更好的
在这种情况下,我会选择“少即是多”。 decltype(auto)
以较少的冗长度为您提供您所追求的东西。