decltype
关于and的两个问题typeof
:
decltype
和运算符之间有什么区别typeof
吗?typeof
在 C++11 中过时了吗?
中没有typeof
运算符c++
。虽然大多数编译器确实提供了这样的功能很长一段时间,但它一直是编译器特定的语言扩展。因此,比较两者的行为通常没有意义,因为typeof
(如果它甚至存在的话)的行为非常依赖于平台。
由于我们现在有了获取变量/表达式类型的标准方法,因此真的没有理由依赖不可移植的扩展,所以我会说它已经过时了。
要考虑的另一件事是,如果行为与给定的编译器typeof
不兼容,则扩展可能不会在未来获得太多开发以包含新的语言功能(这意味着它可能根本不适用于例如 lambdas )。我不知道目前是否如此,但这是一种明显的可能性。decltype
typeof
两者之间的区别在于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
and一致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
用于变量推理。
对于遗留代码,我一直在成功使用以下代码:
#include <type_traits>
#define typeof(x) std::remove_reference<decltype((x))>::type
好吧,typeof
这是一个非标准的 GNU C 扩展,您可以在 GNU C++ 中使用它,因为 GCC 允许您在另一种语言中使用其他语言的功能(尽管并非总是如此),所以它们真的不应该被比较。
当然,其他编译器可能存在其他非标准扩展,但 GCC 绝对是最广泛记录的实现。
回答这个问题:如果它从来不是一个功能,它就不会过时。
如果您想在 C++ 中比较这两种方法的优点,那么语义上没有区别,除非您正在处理引用。您应该使用decltype
它,因为它是可移植的并且符合标准。