C++11 学习笔记-02.auto and decltype

auto

占位符类型说明符 (C++11 起)

对于变量,指定要从其初始化器自动推导出其类型。

auto (1) (C++11 起)
decltype(auto) (2) (C++14 起)
类型制约 auto (3) (C++20 起)
类型制约 decltype(auto) (4) (C++20 起)

#include 
#include 

using namespace  std;


int main()
{
    auto a = 1 + 2;            // a 的类型是 int
    auto c0 = a;             // c0 的类型是 int,保有 a 的副本

    auto d = {1, 2}; // OK:d 的类型是 std::initializer_list
    auto n = {5};    // OK:n 的类型是 std::initializer_list
    auto m{5};
    auto lambda = [](int x) { return x + 3; };

    auto (*p)() -> int; // 声明指向返回 int 的函数的指针

}

decltype 说明符

检查实体的声明类型,或表达式的类

decltype ( 实体 ) (1) (C++11 起)
decltype ( 表达式 ) (2) (C++11 起)

解释:

  • 若实参为无括号的标识表达式或无括号的类成员访问表达式,则 decltype 产生以此表达式命名的实体的类型。若无这种实体,或该实参指名某个重载函数,则程序非良构

  • 若实参是其他类型为 T 的任何表达式,且
    a) 若 表达式 的值类别为亡值,则 decltype 产生 T&&;
    b) 若 表达式 的值类别为左值,则 decltype 产生 T&;
    c) 若 表达式 的值类别为纯右值,则 decltype 产生 T。

注意如果对象的名字带有括号,则它被当做通常的左值表达式,从而 decltype(x) 和 decltype((x)) 通常是不同的类型。
在难以或不可能以标准写法进行声明的类型时,decltype 很有用,例如 lambda 相关类型或依赖于模板形参的类型。

#include 

struct A { double x; };
const A* a;

decltype(a->x) y;       // y 的类型是 double(其声明类型)
decltype((a->x)) z = y; // z 的类型是 const double&(左值表达式)

template
auto add(T t, U u) -> decltype(t + u) // 返回类型依赖于模板形参
{                                     // C++14 开始可以推导返回类型
    return t+u;
}

int main()
{
    int i = 33;
    decltype(i) j = i * 2;

    std::cout << "i = " << i << ", "
              << "j = " << j << '\n';

    auto f = [](int a, int b) -> int
    {
        return a * b;
    };

    decltype(f) g = f; // lambda 的类型是独有且无名的
    i = f(2, 2);
    j = g(3, 3);

    std::cout << "i = " << i << ", "
              << "j = " << j << '\n';
}

你可能感兴趣的:(C++11)