关于decltype
和typeof
的两个问题:
decltype
和typeof
运营商之间是否存在差异?答案 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
是首选(与sizeof
和alignof
一致,以及已在扩展中使用的名称),但正如您在提案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
,因为它是可移植的并且符合标准。