第2.12章: decltype(auto)
什么是 decltype(auto)?
decltype(auto) 关键字结合了 auto 与 decltype 的行为。
它推导表达式的类型,但像 decltype 一样保留引用与 const 限定符。
基础示例
#include <cstddef>
::std::size_t x{42zu};
auto a{x}; // deduced as ::std::size_t (copy)
decltype(auto) b{x}; // deduced as ::std::size_t& (reference)
auto 会剥离引用,而 decltype(auto) 会保留它们。
返回类型
我们稍后会详细介绍函数。
不过这里先展示 decltype(auto) 与函数的配合,因为返回类型是最常见的使用场景。
#include <cstddef>
::std::size_t global{100zu};
auto get_copy() {
return global; // returns ::std::size_t (copy)
}
decltype(auto) get_ref() {
return (global); // returns ::std::size_t& (reference)
}
使用 decltype(auto) 可以确保:如果你返回引用,调用者拿到的就是引用,而不是副本。
⚠️ 小心:圆括号很重要
#include <cstddef>
::std::size_t y{200zu};
decltype(auto) c{y}; // deduced as ::std::size_t (copy)
decltype(auto) d{(y)}; // deduced as ::std::size_t& (reference)
正如 decltype 一样,圆括号会改变含义:
decltype(auto) c{y};→y的声明类型(副本)。decltype(auto) d{(y)};→ 左值表达式,因此推导为引用。
使用 decltype(auto) 时务必留意圆括号。
要点
decltype(auto)像decltype一样推导类型,但拥有auto的便利。- 保留引用与
const限定符。 - 在函数返回类型中最有用,可避免意外的副本。
- 表达式外的圆括号会改变推导结果:
x与(x)不同。 - 函数将在后面讲解,但这个预告说明了
decltype(auto)为何重要。