欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【漫游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的使用