【漫游C++11】auto与decltype
程序员文章站
2024-03-23 10:48:46
...
一、auto
在以前的C++(C++98/C++03)中,auto表示“自动变量”,与之相对的是静态变量(static)。C++11废除了auto的旧含义。
如今的auto是一种类型说明符,它让编译器自动推导变量的类型。
例如:
auto a = 1; // int
auto b = new char[10]; // char*
auto c = Func(); // 这里的auto是Func的返回值的类型
值得一提的是,auto是类型说明符(如int、char),不是类型限定符(const、volatile、restrict),所以,类型限定符必须自己写上去:
constexpr auto ca = 20; // constexpr int
int cc = 30;
const auto &rel = cc; // cosnt int&
如果类型写起来比较长(比如迭代器),使用auto会方便很多:
下面的代码使一个vector中的每个值翻倍。
std::vector<int> vi{ 2,7,1,3 };
for (auto it = vi.begin(); it != vi.cend(); ++it)
{
(*it) *= 2;
std::cout << (*it) << std::endl;
}
如果没有auto,只能这么写:
std::vector<int> vi{ 2,7,1,3 };
for (std::vector<int>::iterator it = vi.begin(); it != vi.cend(); ++it)
{
(*it) *= 2;
}
在C++14中,auto可以作为函数的返回值类型,此时,auto相当于第一条return后面的值的类型,而且所有return返回的类型必须相同。
auto GetWinLong(int n) // int
{
if (n == 0)
{
return 1;
}
else
{
return 20;
}
}
下面是错误的:
auto GetWinLong(int n)
{
if (n == 0)
{
return 1;
}
else
{
return ((char)20); // 错误:推导出的返回类型“char”与之前推导出的类型“int”冲突
}
}
二、decltype
decltype的作用是获得一个变量或表达式的类型:
decltype(1) a = 0; // int
decltype((a)) b = a; // int&
decltype的规则比较复杂,比如加上括号之后就变成了引用类型。详细的介绍可以去看C++标准文档或网上的其他资料。
decltype会将类型说明符和类型限定符一起获得:
constexpr char c = ' '; // 空格
decltype(c) d = 1; // constexpr char
当然,合理地使用它们,会让代码易读易用,滥用会使代码更难理解。
转载于:https://my.oschina.net/jthmath/blog/539838
上一篇: 刷题日记2
下一篇: websocket的使用