什么是 decltype 以及如何使用它

What is decltype and how is it used?

本文关键字:何使用 decltype 什么      更新时间:2023-10-16

我一直找不到关于decltype的好解释。作为一个初级程序员,请告诉我它的作用以及为什么它有用。

例如,我正在读一本书,其中提出了以下问题。有人可以向我解释答案以及原因以及一些好的(初学者级别)示例吗?

每个变量的类型是什么,代码完成后每个变量的值是什么?

int a = 3, b = 4;    
decltype(a) c = a;
decltype((b)) d = a; 
++c; 
++d;

逐行解释将非常有帮助。

decltype是一种

指定类型的方法:你给它一个表达式decltype给你一个与表达式类型对应的类型。具体来说,decltype(e)是以下类型:

  • 如果e是变量的名称,即"id-expression",则结果类型是变量的类型。

  • 否则,如果e的计算结果为 T 类型的左值,则结果类型为 T &,如果e计算结果为 T 类型的右值,则结果类型为 T

将这些规则与引用折叠规则相结合可以让你理解decltype(e) &&,这始终是一个"合适的"引用。(C++14 还添加了 decltype(auto),以结合 decltype 的值类别语义来提供auto的类型推导。

例子:

int foo();
int n = 10;
decltype(n) a = 20;             // a is an "int" [id-expression]
decltype((n)) b = a;            // b is an "int &" [(n) is an lvalue]
decltype(foo()) c = foo();      // c is an "int" [rvalue]
decltype(foo()) && r1 = foo();  // int &&
decltype((n)) && r2 = n;        // int & [& && collapses to &]

可能值得强调的是autodecltype之间的区别:auto研究类型decltype研究表达式

您不应该在"日常"编程中看到或使用decltype。它在通用(模板化)库代码中最有用,其中所讨论的表达式未知并且依赖于参数。(相比之下,auto可以随处大量使用。简而言之,如果你是编程新手,你可能在一段时间内不需要使用decltype