【问题标题】:In which access control context are concepts evaluated?在哪个访问控制上下文中评估概念?
【发布时间】:2019-04-15 05:47:13
【问题描述】:

这个问题是这个one的后续问题

[temp.concept]/5 说:

一个概念没有被实例化([temp.spec])。 [ 注意:表示概念特化的 id 表达式被评估为表达式 ([expr.prim.id])。 [...]]

因此,由于可访问性的原因,命名概念专业化的表达式可能具有不同的值。

如果是这样,我想知道在哪个上下文中评估表达式:

  • 概念定义的上下文;

  • 表达式的上下文;

  • 表达式的上下文递归地应用于出现在概念定义中的概念表达式?

例如,A::b2A::b2_rec 的值是多少?

template<class T>
concept has_private = requires(){ &T::private_;};

template<class T>
concept has_private_rec = has_private<T>;

class B{
   int private_;
   friend class A;
   };

inline constexpr bool b1 = has_private<B>;//I expects false
inline constexpr bool b1_rec = has_private_rec<B>;//I expects false

class A{
   static constexpr bool b2 = has_private<B>; //?
   static constexpr bool b2_rec = has_private_rec<B>; //?
};

注意 Clang 实验概念和 gcc 概念 TS 实现对 b1 和 b1_rec 产生编译错误,但 b2 和 b2_rec 为真;

【问题讨论】:

  • 我猜/希望b2false 但老实说我不知道​​。
  • 我很想赏金,但担心它可能会带来善意但糟糕的答案。
  • @Oliv:标准中的措辞已更改为“未实例化概念([temp.spec])。[注意:概念ID([temp.names])是评估为表达式。一个概念不能被显式实例化([temp.explicit]),显式特化([temp.expl.spec])或部分特化。-结束注]“,我认为这最终意味着这个概念会影响它的价值(在这种情况下,由于类访问控制)

标签: c++ language-lawyer c++-concepts c++20


【解决方案1】:

首先,让我们从requires 表达式开始。 section on the behavior of a requires expression 对其组件表达式的访问控制没有什么特别要说的。同样,访问控制部分也没有特别提到requires 表达式。特别是有[class.access]/4,上面写着:

访问控制统一应用于所有名称,无论名称是从声明还是表达式中引用。

鉴于此,requires 表达式似乎不需要特殊规则。如果您在可以访问某个名称的上下文中使用requires 表达式,则requires 表达式可以访问该名称。否则,它无法访问该名称。

那么concepts 自己呢?嗯,这很简单。 [temp.concept]/3 告诉我们:

概念定义应出现在命名空间范围内。

concepts 因此是全局定义;他们不能是班级的成员。因此,由于是班级成员,他们无法访问。 friend 只能指定函数或类,concepts 两者都不是。因此,concept 由于是朋友而无法访问。

concepts 使用[temp.names]/8 中定义的特殊逻辑进行评估:

如果指定的模板参数满足概念的规范化约束表达式 ([temp.constr.constr]),则概念 ID 的计算结果为 true,否则为 false。

[temp.constr.constr] 中规定的规则中没有任何内容为此类评估提供任何特殊的访问控制。

因此,用作concept 声明一部分的任何requires 表达式都使用全局上下文来确定它们是否可以访问名称。也就是说,他们只能使用public 接口。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
相关资源
最近更新 更多