我很少看到
decltype(auto)
,但当我看到它时,它让我感到困惑,因为从函数返回时它似乎做了与auto
相同的事情。
auto g() { return expr; }
decltype(auto) g() { return expr; }
这两种语法有什么区别?
auto
遵循模板参数推导规则,并且始终是对象类型; decltype(auto)
遵循 decltype
规则根据值类别推导引用类型。所以如果我们有
int x;
int && f();
然后
expression auto decltype(auto)
----------------------------------------
10 int int
x int int
(x) int int &
f() int int &&
auto
返回将 return
子句分配给 auto
变量时推导出的值类型。 decltype(auto)
返回如果将 return 子句包装在 decltype
中将会得到的类型。
auto
按值返回,decltype
也许不是。
简单来说,当用作函数返回时:
auto
可能 删除简历限定符和参考文献。decltype(auto)
保留简历限定符和参考性。例如:
decltype(auto) func(int& x) // Equivalent to `auto& func(int& x)
{
return x;
}
decltype(auto) func(int&& x) // Equivalent to `auto&& func(int&& x)
{
return std::move(x);
}
decltype(auto) func(const int& x) // Equivalent to `const auto& func(int& x)
{
return x;
}
auto& func(const int& x) // Equivalent to `const auto& func(const int&x)
{
return x;
}
template <typename T>
auto func(T &&x) // Equivalent to `T func(T&& x)
{
return x;
}