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

时间:2021-07-21 10:08:09
 #include <iostream>
using namespace std; int main()
{
using cullptr = const unsigned long long *; //C++11新变量类型long long;constexpr unsigned long long * 为非法
typedef wchar_t * wchptr;
/*
使用using或typedef声明的类型别名的变量实例初始化时,不同类型变量不可使用“,”写在同一行
如://cullptr c{0}, wchptr w{0}为非法
*/
cullptr cp1{ (nullptr) }; //C++11新特性nullptr空指针;cullptr cp{ (nullptr) }, wchptr wp({ NULL }); 为非法,或者会报语法错误
wchptr wp1({ NULL });
cullptr cp2 = (), 常无符号长整型指针3 = { cp2 }; // cullptr cp4 = ({ 0 }); 为非法
wchptr wp2 = NULL;
wchptr wp3({ }), 宽字符指针4{ () };
/*
constexpr仅可用于修饰字面值类型的常量表达式,其修饰的表达式在编译时会进行计算。
字面值类型包括:算数类型、引用、指针(初始化值必须为nullptr或0),
而自定义类型、stream、string均不属于字面值类型。
*/
constexpr long double ld{ .f };
constexpr cullptr * cp4 = { ((NULL)) }; // “()”初始化时可多层嵌套,但C++11新特性列表初始化符号“{}”不可以嵌套
constexpr wchptr ** wppp(); /*
类型指示符auto,可将表达式赋值给变量,该变量类型将有编译器自动推断完成,其在变量声明时必须初始化。
推断类型时会忽略初始化表达式中顶层的const特性,
而当初始化表达式为指向一个常量的指针是const特性才会保留下来,否则需手动强制声明为const。
当设定auto为引用时,认为是常量引用。
此外,不一定与初始值一样,编译器会适当改变其类型以更加适应初始化规则。
*/
const wchar_t w = { ('嗨' )};
// 推断为wchar_t * 类型 推断过程中,wchar_t * = const wchar_t + wchptr,变量w的顶层const特性被舍弃。
auto autovar1 = w + wp1;
// 推断为const wchar_t类型,变量w的顶层const特性被舍弃。
auto autovar2 = w;
auto autovar3 = &autovar2; // 推断为wchar_t const * 类型,由于初始化表达式为指向常量值的指针。
auto const autovar4 = autovar3; // 推断为wchar_t const * 类型,关键字顺序不影响推断过程。
auto &autovar5 = w; // 为常量引用 //一个语句中设定多个变量,所有变量的初始值必须为同一种类型。(auto一行代码中仅会推断一种类型)
auto &autovar6 = autovar5, &autovar7 = autovar5; // 此行只能被推断为cosnt wchar_t &autovar5,若autovar7初始化为其他值,则报错。 return ;
}