c++11提供了多种简化声明的方式,尤其是在使用模板时。
auto(在C++中不支持C语言中原来auto的用法)
在C++98中auto是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以auto就没什么价值了。C++11中废弃auto原来的用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象的类型设置为初始化值的类型
int main()
{
int i = 10;
auto p = &i;
auto pf = strcpy;
//输出p、pf的类型
cout << typeid(p).name() << endl;
cout << typeid(pf).name() << endl;
map<string, string> dict = { {"sort", "排序"}, {"insert", "插入"} };
//map<string, string>::iterator it = dict.begin();
auto it = dict.begin();
return 0;
}
decltype
关键字decltype将变量的类型声明为表达式指定的类型
// decltype的一些使用使用场景
template<class T1, class T2>
void F(T1 t1, T2 t2)
{
decltype(t1 * t2) ret = t1 * t2;
vector<decltype(t1* t2)> v;
v.push_back(ret);
cout << typeid(ret).name() << endl;
}
int main()
{
int i = 10;
auto p = &i;
auto pf = strcpy;
decltype(pf) pf1; //char * (__cdecl*)(char *,char const *)
vector<decltype(pf)> v;
cout << typeid(p).name() << endl;
cout << typeid(pf).name() << endl;
return 0;
}
注意:decltype与auto的差别:auto必须要求显式初始化,而decltype没要求
nullptr
由于C++中NULL被定义成字面量0,这样就可能回带来一些问题,因为0既能指针常量,又能表示
整形常量。所以出于清晰和安全的角度考虑,C++11中新增了nullptr,用于表示空指针。
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif