代码之家  ›  专栏  ›  技术社区  ›  Oliv

概念评估能否取决于评估的位置?

  •  15
  • Oliv  · 技术社区  · 6 年前

    [temp.concept]/5

    概念没有实例化([temp.spec])。 [注意:表示概念专门化的id表达式被计算为表达式([expr.prim.id])。[…]]

    [temp.point]/8 )不适用?

    如果两个不同的实例化点根据一个定义规则赋予一个模板专门化不同的含义,则该程序是格式错误的,不需要诊断。


    template<class T>
    concept Complete = sizeof(T)==sizeof(T);
    
    struct A;
    
    constexpr inline bool b1 = Complete<A>; //Complete<A>==false;
    
    struct A{};
    
    constexpr inline bool b2 = Complete<A>; //Complete<A>==true;
    

    one

    1 回复  |  直到 6 年前
        1
  •  11
  •   Barry    5 年前

    概念评估能否取决于评估的位置?

    号码

    以前的情况是这样的(正如我在本次编辑之前的回答所述),但事实证明,这严重抑制了编译器的吞吐量(因为您无法缓存概念检查的结果),并且开始使用它的动机非常弱。这是一个非常晚的变化,通过的一部分 P2104

    如果在程序的不同点上,对于相同的原子约束和模板参数,满足结果不同,则程序是格式错误的,不需要诊断。

    因此,这:

    template<class T>
    concept Complete = sizeof(T) == sizeof(T);
    
    struct A;
    static_assert(!Complete<A>);
    struct A {};
    static_assert(Complete<A>);   
    

    是病态的,NDR(实际上, Complete<A> false 之后 A 完成)。换句话说,我们“记忆”概念的方式与“记忆”模板实例化的方式相同。