C ++中auto和decltype之间的关系是什么?

auto和decltype具有不同的用途,因此它们不会一对一映射。auto是C ++ 11及更高版本中的关键字,用于自动类型推导。decltype类型说明符产生指定表达式的类型。与auto会根据分配给变量的值来推导类型的方式不同,decltype会从传递给它的表达式中推导类型。decltype返回的值可以直接用于定义另一个变量。

auto遵循模板参数推导的规则。您可以在http://en.cppreference.com/w/cpp/language/template_argument_deduction中了解有关这些规则的更多信息

尽管decltype具有规则,但应该遵循标准中定义的规则。以下是这些规则的摘录:

类似于sizeof运算符,decltype的操作数是未求值的。非正式地,由decltype(e)返回的类型推导如下:

  • 如果表达式e引用本地或命名空间范围内的变量,静态成员变量或函数参数,则结果是该变量或参数的声明类型

  • 如果e是函数调用或重载的运算符调用,则decltype(e)表示该函数的声明的返回类型。

  • 否则,如果e为左值,则decltype(e)为T&,其中T为e的类型;否则为e。如果e是一个右值,则结果为T

这些语义旨在满足通用库编写者的需求,同时对新手程序员而言也很直观,因为decltype的返回类型始终与源代码中声明的对象或函数的类型完全匹配。更正式地说,规则1适用于非括号的id表达式和类成员访问表达式。对于函数调用,推导类型是静态选择的函数的返回类型,由重载解析规则确定。 

示例

使用auto和decltype的示例,

#include<iostream>
#include<vector>

using namespace std;

int main() {
    //使用auto进行类型推导
    vector<int> arr(10);
    for(auto it = arr.begin(); it != arr.end(); it ++) {
        cin >> *it;
    }

    //使用decltype进行类型推导
    vector<int> arr(10);
    for (decltype(arr.begin()) it = arr.begin(); it != arr.end(); it++) {
        cin >> *it;
    }
    return 0;
}

请注意,由decltype表示的类型可以与由auto推断的类型不同。您可以在这12页的C ++中的类型归纳解释中了解有关这些细微差别的更多信息-http: //thbecker.net/articles/auto_and_decltype/section_01.html