第2.12章: decltype(auto)

English

什么是 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) 时务必留意圆括号。

要点