C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

 1 #include <iostream>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     using cullptr = const unsigned long long *; //C++11新变量类型long long;constexpr unsigned long long * 为非法
 7     typedef wchar_t * wchptr;
 8     /*
 9     使用using或typedef声明的类型别名的变量实例初始化时,不同类型变量不可使用“,”写在同一行
10     如://cullptr c{0}, wchptr w{0}为非法
11     */
12     cullptr cp1{ (nullptr) }; //C++11新特性nullptr空指针;cullptr cp{ (nullptr) }, wchptr wp({ NULL }); 为非法,或者会报语法错误
13     wchptr wp1({ NULL });
14     cullptr cp2 = (0), 常无符号长整型指针3 = { cp2 }; // cullptr cp4 = ({ 0 }); 为非法
15     wchptr wp2 = NULL;
16     wchptr wp3({ 0 }), 宽字符指针4{ (0) };
17     /*
18     constexpr仅可用于修饰字面值类型的常量表达式,其修饰的表达式在编译时会进行计算。
19     字面值类型包括:算数类型、引用、指针(初始化值必须为nullptr或0),
20     而自定义类型、stream、string均不属于字面值类型。
21     */
22     constexpr long double ld{ 0.f };
23     constexpr cullptr * cp4 = { ((NULL)) }; // “()”初始化时可多层嵌套,但C++11新特性列表初始化符号“{}”不可以嵌套
24     constexpr wchptr ** wppp(0);
25 
26     /*
27     类型指示符auto,可将表达式赋值给变量,该变量类型将有编译器自动推断完成,其在变量声明时必须初始化。
28     推断类型时会忽略初始化表达式中顶层的const特性,
29     而当初始化表达式为指向一个常量的指针是const特性才会保留下来,否则需手动强制声明为const。
30     当设定auto为引用时,认为是常量引用。
31     此外,不一定与初始值一样,编译器会适当改变其类型以更加适应初始化规则。
32     */
33     const wchar_t w = { ('' )};
34     // 推断为wchar_t * 类型 推断过程中,wchar_t * = const wchar_t + wchptr,变量w的顶层const特性被舍弃。
35     auto autovar1 = w + wp1; 
36     // 推断为const wchar_t类型,变量w的顶层const特性被舍弃。
37     auto autovar2 = w; 
38     auto autovar3 = &autovar2; // 推断为wchar_t const * 类型,由于初始化表达式为指向常量值的指针。
39     auto const autovar4 = autovar3; // 推断为wchar_t const * 类型,关键字顺序不影响推断过程。
40     auto &autovar5 = w; // 为常量引用
41 
42     //一个语句中设定多个变量,所有变量的初始值必须为同一种类型。(auto一行代码中仅会推断一种类型)
43     auto &autovar6 = autovar5, &autovar7 = autovar5; // 此行只能被推断为cosnt wchar_t &autovar5,若autovar7初始化为其他值,则报错。
44 
45     return 0;
46 }
原文地址:https://www.cnblogs.com/vico2316/p/6105947.html