关于 decltype
和 typeof
的两个问题:
decltype
和typeof
运算符有什么区别吗?C++11
中是否弃用了typeof
?
c++
中没有typeof
运算符。 虽然大多数编译器一直提供了这样的功能,但它始终是编译器特定的语言扩展。因此,通常比较两者的行为是没有意义的,因为typeof
(如果它确实存在)的行为极度依赖于平台。
由于我们现在有了一种标准方式来获取变量/表达式的类型,所以真的没有理由依赖于不可移植的扩展,因此我会说它已经过时了。
另一个需要考虑的问题是,如果某个编译器的typeof
行为与decltype
不兼容,那么typeof
扩展未来可能无法涵盖新的语言特性(这意味着它可能根本无法与例如lambda一起使用)。 我不知道当前是否出现了这种情况,但这是一个明显的可能性。
decltype
这种语法存在,并不意味着 typeof
已经过时,因为 typeof
在 gcc、EDG 和 Metroworks 中的引用去除语义对于声明该类型的本地变量非常有用。然而,现在与 auto
结合使用,它已经变得相当不必要了。遗憾的是,由于现有实现差异的缘故,我们不能使用理想命名的 typeof
(与 alignof
、sizeof
押韵)。 - Dwayne Robinsondecltype
始终将引用作为信息的一部分保留,而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
decltype
完全取代了typeof
是不正确的(如果你想要去除引用语义,那么在这些编译器中,typeof扩展仍然有用),而是,decltype
加上auto
主要取代了typeof
,它可以去除引用并替代typeof
用于变量推断的用法。typeof
功能。在N2927中有相关信息。对于遗留代码,我一直成功地使用以下内容:
#include <type_traits>
#define typeof(x) std::remove_reference<decltype((x))>::type
decltype(x)
和decltype((x))
之间的区别通常只是多了一些&
,而你最终还是会将其删除?或者我漏掉了什么? - Yakk - Adam Nevraumontbob<int, char>
这样的参数,你还需要使用 ...
和 __VA_ARGS__
。 - Yakk - Adam Nevraumont嗯,typeof
是一种非标准的GNU C扩展,你可以在GNU C++中使用它,因为GCC允许你在另一种语言中使用其他语言的特性(不总是如此),所以它们真的不应该被比较。
当然,其他编译器可能存在其他非标准扩展,但是GCC绝对是最广泛记录的实现。
回答这个问题:如果它从未成为一个特性,那么它就不能过时。
如果你想在C ++中比较两种方法的优点,除非你处理引用,语义上没有区别。你应该使用decltype
,因为它是可移植和符合标准的。
typeof
从来没有成为标准。 - GManNickGdecltype
有着明确定义且有趣的语义,它允许你在非常普遍的情况下说出像decltype(x)&&
这样的话。 - Kerrek SB