template <class T, class U> decltype(*(T*)(0) * *(U*)(0)) mul(T x, U y) {
return x * y;
}
这段代码取自 Stroustrup 的C++11 FAQ。我理解它的作用,就是将两个不同类型的对象相乘。令我困惑的是模板参数和函数定义之间的语法。里面发生了什么decltype
?我认为它正在取消引用T
初始化为 0 的未命名指针,并将其乘以U
以相同方式取消引用和初始化的未命名指针。我对吗?
好吧,如果这是正在发生的事情,那么使用指针、取消引用和额外的括号不是多余的吗?我不能在保持预期效果的同时初始化这样的类型吗?:
template <class T, class U> decltype(T(0) * U(0)) mul(T x, U y) {
return x * y;
}
这对我来说看起来更干净,并且在将两个数字相乘时确实具有相同的效果,就像第一个一样......
mul(4, 3); // 12
那么为什么 Stroustrup 坚持使用复杂的指针、解引用和初始化语法呢?当然,这是在他介绍新auto
语法之前。但无论如何,我的问题是:上述两种类型初始化形式有什么区别吗?他在哪里使用指针并立即取消引用它们,而不是简单地做我所做的,即初始化没有指针或取消引用的类型?任何回应表示赞赏。