【问题标题】:Why doesn't Same<T, U> subsume Same<U, T>?为什么 Same<T, U> 不包含 Same<U, T>?
【发布时间】:2020-02-10 06:58:23
【问题描述】:

LWG 3182 中声明

18.4.2 [concept.same] 中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&lt;T, U&gt; 不包含 Same&lt;U, T&gt;,反之亦然。

但是,来自cppreference

...满足交换性,即对于TUis_same&lt;T, U&gt;::value == true任意两种类型当且仅当is_same&lt;U, T&gt;::value == true

注意Same&lt;T, U&gt;被定义为is_same_v&lt;T, U&gt;Same&lt;T, U&gt;怎么可能不包含Same&lt;U, T&gt;

【问题讨论】:

    标签: c++ c++-standard-library c++20 c++-concepts


    【解决方案1】:

    该问题涉及标准概念Same,已重命名为same_as,并通过以下方式解决 指定为[concept.same]:

     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&lt;T, U&gt;没有包含Same&lt;U, T&gt;) 是因为only concepts can be subsumed, 这就是为什么在规范中必须使用仅用于说明的概念 same-as-impl

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 2020-12-06
      • 1970-01-01
      • 2016-12-12
      相关资源
      最近更新 更多