71

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

例如,我正在阅读一本提出以下问题的书。有人可以向我解释答案以及为什么,以及一些好的(初级)例子吗?

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

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

decltype((b)) d = a; 

++c; 

++d;

逐行解释将非常有帮助。

4

1 回答 1

106

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

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

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

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

例子:

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 &]

auto可能值得强调和之间的区别decltypeauto适用于类型decltype适用于表达式

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

于 2013-09-15T17:33:17.627 回答