什么是 decltype 以及如何使用它
What is decltype and how is it used?
我一直找不到关于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 &]
可能值得强调的是auto
和decltype
之间的区别:auto
研究类型,decltype
研究表达式。
您不应该在"日常"编程中看到或使用decltype
。它在通用(模板化)库代码中最有用,其中所讨论的表达式未知并且依赖于参数。(相比之下,auto
可以随处大量使用。简而言之,如果你是编程新手,你可能在一段时间内不需要使用decltype
。
相关文章:
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 是否可以在不使用 decltype 的情况下推断先前定义的 extern 变量的类型
- 我可以使用 decltype() 或其他东西通过指针获取真实类型吗?
- 在部分模板专用化中使用 decltype
- 如何在私有类成员上使用 decltype?
- 如何使用 decltype 获取没有引用的指针?
- 在扣除自动之前使用decltype(auto) <func>
- 元函数使用 decltype 返回元素类型
- 使用 decltype(this) 获取函数引用
- 使用“decltype”获取迭代器的类型
- 我可以在没有任何实例变量的情况下使用 decltype 吗?
- 静态断言 std::array 的大小,其类型是使用 decltype 从成员函数的返回值中获取的
- 在 C++14 中使用 decltype(auto) 声明静态数据成员
- 模板函数的返回类型未知,使用 decltype 时代码重复
- 使用 decltype 的条件声明类型
- 使用decltype的动态多态类型演绎
- 使用 decltype 显式析构函数调用
- 使用decltype尾部返回类型专门化函数模板
- 什么时候应该使用 decltype(x) 而不是 auto 来声明变量的类型
- 使用 decltype() 声明函数签名