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
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP