【发布时间】:2014-02-17 14:21:24
【问题描述】:
我很少看到decltype(auto),但是当我看到它时让我感到困惑,因为它似乎在从函数返回时与auto 做同样的事情。
auto g() { return expr; }
decltype(auto) g() { return expr; }
这两种语法有什么区别?
【问题讨论】:
我很少看到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 &&
【讨论】:
int。只有 xvalues 成为右值引用。
auto 会更有用(例如,如果你有 auto && 用于通用参考)。 decltype 在您主要想使用 types (而不是变量)进行操作时很有用,例如在检查某些表达式是否具有某种类型的特征中。
f() 返回一个 int。 decltype((f(x))) 会返回 int && 吗?
int。只有 xvalues 而不是 prvalues 成为右值引用。
auto 返回您将return 子句分配给auto 变量的值类型。 decltype(auto) 返回如果您将 return 子句包装在 decltype 中会得到什么类型。
auto 按值返回,decltype 可能不是。
【讨论】: