关于
decltype
和typeof
的两个问题:
decltype
和typeof
运算符之间有什么区别吗?typeof
在 C++11 中是否已过时?typeof
中没有 c++
运算符。虽然大多数编译器确实已经提供这种功能相当长一段时间了,但它始终是编译器特定的语言扩展。因此,比较两者的行为通常是没有意义的,因为 typeof
的行为(如果它存在的话)极其依赖于平台。
由于我们现在有了获取变量/表达式类型的标准方法,因此实际上没有理由依赖非可移植扩展,所以我想说它已经过时了。
要考虑的另一件事是,如果
typeof
的行为与给定编译器的 decltype
不兼容,则 typeof
扩展可能不会得到太多开发来包含未来的新语言功能(这意味着它可能根本不适用于 lambda 等)。我不知道目前情况是否如此,但这是一种明显的可能性。
两者之间的区别在于,
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。”
J。 Jarvi、B. Stroustrup、D. Gregor、J. Siek:Decltype 和 auto。 N1478/03-0061.
因此,说
decltype
完全被消除了typeof
(如果您想要引用删除语义,那么这些编译器中的typeof扩展仍然有用)是不正确的,而是,typeof
在很大程度上被它加上所消除了auto
,它会删除引用并替换用于变量推断的 typeof
的用途。
附注2023-01-03 C23(不是 C++)显然将在
N2927中正式获得
typeof
。
对于遗留代码,我一直在成功使用以下内容:
#include <type_traits>
#define typeof(x) std::remove_reference<decltype((x))>::type
typeof 尚未标准化,尽管它是由多个编译器供应商实现的,例如 GCC。它随着 decltype 变得过时了。
好吧,
typeof
是一个非标准的 GNU C 扩展,您可以在 GNU C++ 中使用它,因为 GCC 允许您在另一种语言中使用其他语言的功能(但并不总是如此),所以它们确实不应该进行比较。
当然,其他编译器可能存在其他非标准扩展,但 GCC 绝对是记录最广泛的实现。
回答这个问题:如果它从来都不是一个功能,它就不会过时。
如果您想比较 C++ 中任一方法的优点,那么在语义上没有区别,除非您正在处理引用。您应该使用
decltype
,因为它便于携带且符合标准。