从函数返回时,auto 和 decltype(auto) 有什么区别?

问题描述 投票:0回答:3

我很少看到

decltype(auto)
,但当我看到它时,它让我感到困惑,因为从函数返回时它似乎做了与
auto
相同的事情。

auto g() { return expr; }
decltype(auto) g() { return expr; }

这两种语法有什么区别?

c++ c++14
3个回答
84
投票

auto
遵循模板参数推导规则,并且始终是对象类型;
decltype(auto)
遵循
decltype
规则根据值类别推导引用类型。所以如果我们有

int x;
int && f();

然后

expression    auto       decltype(auto)
----------------------------------------
10            int        int
x             int        int
(x)           int        int &
f()           int        int &&

24
投票

auto
返回将
return
子句分配给
auto
变量时推导出的值类型。
decltype(auto)
返回如果将 return 子句包装在
decltype
中将会得到的类型。

auto
按值返回,
decltype
也许不是。


0
投票

简单来说,当用作函数返回时:

  • 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;
} 

© www.soinside.com 2019 - 2024. All rights reserved.