为了了解它是如何工作的,我查看了标题 type_traits
中 std::common_type
的 libstdc++ 实现。我不得不承认我并不真正理解它是如何工作的。在这里:
/// common_type
template<typename... _Tp>
struct common_type;
template<typename _Tp>
struct common_type<_Tp>
{ typedef _Tp type; };
template<typename _Tp, typename _Up>
struct common_type<_Tp, _Up>
{ typedef decltype(true ? declval<_Tp>() : declval<_Up>()) type; };
template<typename _Tp, typename _Up, typename... _Vp>
struct common_type<_Tp, _Up, _Vp...>
{
typedef typename
common_type<typename common_type<_Tp, _Up>::type, _Vp...>::type type;
};
我很清楚第一个、第二个和第四个声明是如何工作的。但是,我无法理解第三个声明是如何工作的。有人可以尝试解释这里使用的机制吗?
最佳答案
首先,std::declval<T>()
产生 T
类型的右值.尝试对该值做任何事情都会失败,因此它只能在未评估的上下文中使用。接下来,三元运算符将其类型推导为两个参数共有的最特殊类型(如果没有这种类型,则失败)。所以,表达式的类型
true? declval<T0>(): declval<T1>()
是 T0
最专业的常见类型和 T1
.剩下的就是将此表达式转换为类型并确保不对它求值。 decltype(expr)
就是这样做的。显然,逻辑的两个参数版本:其他版本用于处理极端情况(一个参数)并利用两个参数版本产生任意类型的通用类型。
关于c++ - std::common_type 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12290046/