Gri*_*zly 21
没有typeof
操作员c++
.虽然大多数编译器在很长一段时间内都提供了这样的功能,但它始终是编译器特定的语言扩展.因此,通常比较两者的行为是没有意义的,因为typeof
(如果它甚至存在)的行为是非常依赖于平台的.
由于我们现在有一种获取变量/表达式类型的标准方法,因此没有理由依赖非可移植扩展,所以我认为它已经过时了.
另一件需要考虑的事情是,如果行为typeof
与decltype
给定的编译器不兼容,那么typeof
扩展将来可能无法进行大量开发以包含新的语言功能(这意味着它可能根本不适用于例如lambdas ).我不知道目前情况是否如此,但这是一个明显的可能性.
Dwa*_*son 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
Run Code Online (Sandbox Code Playgroud)
该名称typeof
是首选(与扩展名已经使用的sizeof
和alignof
,以及名称一致),但正如您在提案N1478中所看到的那样,关注与现有实现的兼容性丢弃引用会导致它们给它一个不同的名称.
"我们在引用查询表达式类型的机制时通常使用运算符名称typeof.decltype运算符指的是typeof的变体....某些编译器供应商(EDG,Metrowerks,GCC)提供了typeof运算符作为具有引用删除语义的扩展.如第4节所述,这似乎是表达变量类型的理想选择.另一方面,引用删除语义无法提供精确表达泛型返回类型的机制函数...在这个提议中,提供表达式类型信息的运算符的语义反映了声明的类型.因此,我们建议将运算符命名为decltype."
J. Jarvi,B.Stroustrup,D.Gregor,J.Siek:Decltype and auto.N1478/03-0061.
所以说decltype
完全避免typeof
(如果你想要引用丢弃语义,然后那些编译器中的扩展类型仍然有用)是不正确的,而是,它typeof
在很大程度上被它加以避免auto
,它确实丢弃引用并替换typeof
用于变量的用途推理.
对于遗留代码,我一直在成功使用以下内容:
#include <type_traits>
#define typeof(x) std::remove_reference<decltype((x))>::type
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5217 次 |
最近记录: |