decltype和typeof之间的区别?

时间:2013-01-02 23:17:51

标签: c++ c++11 typeof decltype

关于decltypetypeof的两个问题:

  • decltypetypeof运营商之间是否存在差异?
  • {+ 1}在C ++ 11中是否已过时?

5 个答案:

答案 0 :(得分:21)

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

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

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

答案 1 :(得分: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

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

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

学家Jarvi,B。Stroustrup,D。Gregor,J。Siek:Decltype和auto。 N1478 / 03-0061。

所以说decltype完全避免了typeof是不正确的(如果你想要引用删除语义,那么这些编译器中的扩展类型仍然有用),而是{{} 1}}在很大程度上被它加上typeof所避免,它确实删除了引用并替换了auto用于变量推断的用法。

答案 2 :(得分:3)

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

#include <type_traits>
#define typeof(x) std::remove_reference<decltype((x))>::type

答案 3 :(得分:1)

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

可以找到关于typeof缺点的一个很好的解释in this related answer

答案 4 :(得分:0)

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

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

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

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

相关问题