33

decltype关于and的两个问题typeof

  • decltype和运算符之间有什么区别typeof吗?
  • typeof在 C++11 中过时了吗?
4

5 回答 5

28

中没有typeof运算符c++。虽然大多数编译器确实提供了这样的功能很长一段时间,但它一直是编译器特定的语言扩展。因此,比较两者的行为通常没有意义,因为typeof(如果它甚至存在的话)的行为非常依赖于平台。

由于我们现在有了获取变量/表达式类型的标准方法,因此真的没有理由依赖不可移植的扩展,所以我会说它已经过时了。

要考虑的另一件事是,如果行为与给定的编译器typeof不兼容,则扩展可能不会在未来获得太多开发以包含新的语言功能(这意味着它可能根本不适用于例如 lambdas )。我不知道目前是否如此,但这是一种明显的可能性。decltypetypeof

于 2013-01-03T00:13:45.827 回答
17

两者之间的区别在于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

该名称typeof是首选(与sizeofand一致alignof,并且该名称已在扩展中使用),但正如您在提案 N1478 中看到的那样,对与现有实现的兼容性的担忧导致他们给它一个独特的名称。

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

J. Jarvi、B. Stroustrup、D. Gregor、J. Siek:Decltype 和 auto。N1478/03-0061。

所以说decltype完全消除是不正确的typeof(如果你想引用删除语义,那么这些编译器中的 typeof 扩展仍然可以使用),而是typeof在很大程度上被它所消除 plus auto,它确实删除了引用并替换了使用 wheretypeof用于变量推理。

于 2014-11-02T08:39:03.223 回答
7

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

#include <type_traits>
#define typeof(x) std::remove_reference<decltype((x))>::type
于 2016-02-29T10:45:01.607 回答
1

typeof 尚未标准化,尽管它已由多个编译器供应商实现,例如GCC。它因 decltype 而过时。

可以在这个相关答案中找到对 typeof 缺点的一个很好的解释。

于 2013-01-03T00:12:04.070 回答
0

好吧,typeof这是一个非标准的 GNU C 扩展,您可以在 GNU C++ 中使用它,因为 GCC 允许您在另一种语言中使用其他语言的功能(尽管并非总是如此),所以它们真的不应该被比较。

当然,其他编译器可能存在其他非标准扩展,但 GCC 绝对是最广泛记录的实现。

回答这个问题:如果它从来不是一个功能,它就不会过时。

如果您想在 C++ 中比较这两种方法的优点,那么语义上没有区别,除非您正在处理引用。您应该使用decltype它,因为它是可移植的并且符合标准。

于 2014-11-02T08:49:32.757 回答