什么是 dectype 以及如何使用它?

我还没能找到一个很好的解释。请告诉我,作为一个初级程序员,它是做什么的,为什么它是有用的。

例如,我正在读一本书,书中提出了以下问题。有没有人能给我解释一下这个问题的答案和原因,以及一些好的(初学者级别的)例子?

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

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


decltype((b)) d = a;


++c;


++d;

逐行解释会很有帮助。

31922 次浏览

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

  • 如果 e是变量的名称,也就是“ id-expression”,那么结果类型就是变量的类型。

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

将这些规则与引用折叠规则结合起来,可以理解 decltype(e) &&,它始终是一个“合适的”引用。(C + + 14还添加了 decltype(auto),以便将 auto的类型演绎与 decltype的值类别语义结合起来。)

例子:

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