C++ 中 auto 和 decltype 之间的关系是什么?
auto 和 decltype 具有不同的用途,因此它们之间没有一一对应关系。auto 是 C++11 及更高版本中的一个关键字,用于自动类型推导。decltype 类型说明符会生成指定表达式的类型。与根据分配给变量的值推导类型的 auto 不同,decltype 从传递给它的表达式推导类型。decltype 返回的值可以直接用于定义另一个变量。
auto 遵循模板参数推导规则。您可以在 https://cppreference.cn/w/cpp/language/template_argument_deduction 上阅读更多关于这些规则的信息。
虽然 decltype 有一些标准中定义的规则需要遵循。以下是标准中包含这些规则的摘录
与 sizeof 运算符类似,decltype 的操作数不会被求值。非正式地,decltype(e) 返回的类型如下推导:
- 如果表达式 e 指的是局部或命名空间范围内的变量、静态成员变量或函数参数,则结果是该变量或参数的声明类型
- 如果 e 是函数调用或重载运算符调用,则 decltype(e) 表示该函数的声明返回类型
- 否则,如果 e 是左值,则 decltype(e) 是 T&,其中 T 是 e 的类型;如果 e 是右值,则结果是 T
这些语义旨在满足通用库编写者的需求,同时对于新手程序员来说也很直观,因为 decltype 的返回类型始终与源代码中声明的对象或函数的类型完全匹配。更正式地说,规则 1 应用于未加括号的 id-表达式和类成员访问表达式。对于函数调用,推导出的类型是静态选择的函数的返回类型,由重载解析规则确定。
示例
使用 auto 和 decltype 的示例:
#include<iostream> #include<vector> using namespace std; int main() { // Using auto for type deduction vector<int> arr(10); for(auto it = arr.begin(); it != arr.end(); it ++) { cin >> *it; } // Using decltype for type deduction vector<int> arr(10); for (decltype(arr.begin()) it = arr.begin(); it != arr.end(); it++) { cin >> *it; } return 0; }
请注意,decltype 表示的类型可能与 auto 推导出的类型不同。您可以在这份关于 C++ 中类型推导的 12 页解释中阅读更多关于这些细微差别的信息:http://thbecker.net/articles/auto_and_decltype/section_01.html
广告