decltype和typeof之间的区别?

MBZ*_*MBZ 23 c++ typeof decltype c++11

关于decltype和的两个问题typeof:

  • decltypetypeof运营商之间有什么区别吗?
  • typeof在C++ 11中会变得过时吗?

Gri*_*zly 21

没有typeof操作员c++.虽然大多数编译器在很长一段时间内都提供了这样的功能,但它始终是编译器特定的语言扩展.因此,通常比较两者的行为是没有意义的,因为typeof(如果它甚至存在)的行为是非常依赖于平台的.

由于我们现在有一种获取变量/表达式类型的标准方法,因此没有理由依赖非可移植扩展,所以我认为它已经过时了.

另一件需要考虑的事情是,如果行为typeofdecltype给定的编译器不兼容,那么typeof扩展将来可能无法进行大量开发以包含新的语言功能(这意味着它可能根本不适用于例如lambdas ).我不知道目前情况是否如此,但这是一个明显的可能性.

  • 由于“decltype”本身,它并没有完全过时,因为“typeof”的引用删除语义(在 gcc、EDG、Metroworks 中)对于声明该类型的局部变量非常有用。然而,当与“auto”结合使用时,现在就没有必要了。遗憾的是,由于现有的实现差异,我们无法使用理想的“typeof”(与“alignof”、“sizeof”押韵)。 (2认同)

Dwa*_*son 10

两者之间的区别在于decltype始终将引用保留为信息的一部分,而typeof不是.所以...

int a = 1;
int& ra = a;
typeof(a) b = 1;     // int
typeof(ra) b2 = 1;   // int
decltype(a) b3;      // int
decltype(ra) b4 = a; // reference to int
Run Code Online (Sandbox Code Playgroud)

该名称typeof是首选(与扩展名已经使用的sizeofalignof,以及名称一致),但正如您在提案N1478中所看到的那样,关注与现有实现的兼容性丢弃引用会导致它们给它一个不同的名称.

"我们在引用查询表达式类型的机制时通常使用运算符名称typeof.decltype运算符指的是typeof的变体....某些编译器供应商(EDG,Metrowerks,GCC)提供了typeof运算符作为具有引用删除语义的扩展.如第4节所述,这似乎是表达变量类型的理想选择.另一方面,引用删除语义无法提供精确表达泛型返回类型的机制函数...在这个提议中,提供表达式类型信息的运算符的语义反映了声明的类型.因此,我们建议将运算符命名为decltype."

J. Jarvi,B.Stroustrup,D.Gregor,J.Siek:Decltype and auto.N1478/03-0061.

所以说decltype完全避免typeof(如果你想要引用丢弃语义,然后那些编译器中的扩展类型仍然有用)是不正确的,而是,它typeof在很大程度上被它加以避免auto,它确实丢弃引用并替换typeof用于变量的用途推理.


use*_*178 7

对于遗留代码,我一直在成功使用以下内容:

#include <type_traits>
#define typeof(x) std::remove_reference<decltype((x))>::type
Run Code Online (Sandbox Code Playgroud)

  • 你还需要 `...` 和 `__VA_ARGS__` 或 `bob&lt;int,char&gt;` 作为参数不会被 c 预处理器解析。 (2认同)