auto & decltype

简要介绍下 auto 和 decltype 的使用,后面有几节内容专门说明c++中类型推导,全面了解请看后面的类型推导几节。

auto

auto会忽略掉顶层const,保留底层const

const int ci = i, &cr = ci;
auto b = ci; // b是一个整数(ci的顶层const被改变)
auto c = cr; // c是一个整数(cr是ci的别名,ci本身是一个顶层const)

如果希望推断出的auto类型为是一个顶层const,则需要明确指出const auto f = ci; 设置一个类型为auto的引用时,初始值的顶层常量属性仍然保留

auto &d = ci; // d是一个整型常量引用,绑定到ci
auto &e = 42; // 错误,不能为非常量引用绑定字面值
const auto &f = 42; // 正确,可以为常量引用绑定到字面值

decltype

decltype(f()) sum  = x; // sum的类型就是函数f的返回类型,编译器不实际调用函数f

decltype(var)会返回变量的类型,包括顶层const和引用在内。引用从来都是作为所指对象的同义词出现,除了delctype

const int ci = 0, &cj = ci;
decltype(ci) x = 0; // x 的类型是 const int
decltype(cj) y = x; // y 的类型时 const int &, y 绑定到 x
decltype(cj) z; // 错误:z是一个引用,必须初始化

如果表达式内容是解引用操作,则decltype会得到引用类型。解引用指针可以得到指针所指的对象,而且还能给这个对象赋值,因此decltype(*p)的结果类型就是int &而非int

int i = 42, *p = &i;
decltype(*p) c; // 错误:c是int &,必须初始化

decltype((var))得到的永远是引用,decltype(var)只有当var是引用时得到的才是引用。

results matching ""

    No results matching ""