[effective modern c++][3]理解decltype

简单的例子

const int i = 0;            // decltype(i): const int
bool f(const Widget& w);    // decltype(w): const Widget&
struct Point {
    int x, y;               // decltype(Point::x): int, decltype(Point::y): int
};
Widget w;                   // decltype(w): Widget
if (f(w)) ...               // decltype(f(w)) is bool
template <typename T>       // std::vector 的简化版本
class vector {
public:
    ...
    T& operator[](std::size_t index);
    ...
};
vector<int> v;              // decltype(v): vector<int>
if (v[0] == 0) ...          // decltype(v[0]): int&

函数的返回值,依赖于函数的参数

c++11

template <typename Container, typename Index>
auto authAndAccess(Container&& c, Index i)
-> decltype(std::forward<Container>(c)[i]) {
    authenticateUser();
    return std::forward<Container>(c)[i];
}

c++14

template <typename Container, typename Index>
auto authAndAccess(Container&& c, Index i) {
    authenticateUser();
    return std::forward<Container>(c)[i];
}

注意,这里的auto遵循template的类型推断,具体见理解auto类型推断
所以,c++14的版本与c++11版本返回值类型有所区别!
为了保证c++14版本返回的正确性

template <typename Container, typename Index>
decltype(auto) authAndAccess(Container&& c, Index i) {
    authenticateUser();
    return c[i];
}

decltype(auto)是c++14的新特性,除了用于函数的返回值,还能用于其他地方

Widget w;
const Widget& cw = w;
auto myWidget1 = cw;            // myWidget1: Widget
decltype(auto) myWidget2 = cw;  // myWidget2: const Widget&

使用在左值表达式上

使用在左值表达式上时,总是返回左值引用

int x = 0;  // decltype(x): int, decltype((x)): int&
decltype(auto) f1() {
    int x = 0;
    return x; // decltype(x): int
}
decltype(auto) f2() {
    int x = 0;
    return (x); // decltype((x)): int&
}

牢记

  • decltype一般返回的都是你期待的类型
  • 在左值表达式T上,decltype总是返回T&
  • c++14支持decltype(auto)表现与auto类似,但是应用decltype的规则
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值