为什么 Same<T, U> 不包含 Same<U, T>?

Why doesn't Same<T, U> subsume Same<U, T>?

本文关键字:gt lt Same 包含 为什么      更新时间:2023-10-16

在 LWG 3182 中,它指出

18.4.2 [概念相同] 中Same概念的规范:

template<class T, class U>
concept Same = is_same_v<T, U>;
-1- Same<T, U> subsumes Same<U, T> and vice versa.

似乎矛盾。仅从概念定义来看,Same<T, U>并不包括Same<U, T>,反之亦然。

但是,从 cpp 偏好来看,

。交换性是满足的,即对于任何两种类型的TUis_same<T, U>::value == true当且仅当is_same<U, T>::value == true

注意Same<T, U>被定义为is_same_v<T, U>Same<T, U>怎么能不包含Same<U, T>呢?

这个问题指的是标准概念Same,它被重命名为same_as,并通过以下方式解决 将其指定为 [概念相同]:

template<class T, class U>
concept same-as-impl = is_same_v<T, U>;       // exposition only
template<class T, class U>
concept same_as = same-as-impl<T, U> && same-as-impl<U, T>;

直截了当的定义不对称的原因(即Same<T, U>没有包括Same<U, T>( 因为只有概念才能被归纳, 这就是为什么规范中需要仅博览会的概念same-as-impl