什么是decltype以及如何使用?

时间:2013-09-15 17:19:38

标签: c++ c++11 decltype

我无法找到对decltype的良好解释。请告诉我,作为一名初学程序员,它的作用以及它为何有用。

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

  

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

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

decltype((b)) d = a; 

++c; 

++d;

逐行解释会非常有用。

1 个答案:

答案 0 :(得分:51)

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 &

可能值得强调autodecltype之间的区别:auto适用于类型,而decltype适用于表达式

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