In which access control context are concepts evaluated?(在哪个访问控制上下文中评估概念?)
问题描述
此问题是one的后续问题
[temp.concept]/5表示:
概念未实例化([temp.spec])。 [ 注意:表示概念专门化的id表达式作为表达式([expr.prim.id])求值。[.]]
因此,命名概念专门化表达式可能因可访问性而具有不同的值。
如果是这样的话,我想知道表达式将在什么上下文中求值:
概念定义的上下文;
表达式的上下文;
表达式的上下文递归应用于概念定义中出现的概念表达式?
例如,A::b2
和A::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为真;
推荐答案
首先,让我们从requires
表达式开始。关于其组件表达式的访问控制,section on the behavior of a requires
expression没有什么特别要说的。同样,关于访问控制的部分没有特别提到requires
表达式。特别是[class.access]/4,它说:
访问控制统一应用于所有名称,无论这些名称是从声明还是表达式引用的。
鉴于此,requires
表达式不需要特殊规则似乎相当清楚。如果在可以访问某个名称的上下文中使用requires
表达式,则requires
表达式可以访问该名称。否则,它无法访问该名称。
concept
本身又如何呢?嗯,那很简单。[temp.concept]/3告诉我们:
因此概念定义应出现在命名空间作用域中。
concept
是全局定义;它们不能是类的成员。因此,由于是类成员,他们无法访问。friend
只能指定函数或类,concept
两者都不能。因此,aconcept
由于是朋友而无法访问。
concept
使用[temp.names]/8中定义的特殊逻辑进行计算:
如果指定的模板参数满足概念的规范化约束表达式([temp.constr.conr]),则Concept-id的计算结果为True,否则为False。
[temp.constr.constr]中规定的规则中没有为此类评估提供任何特殊访问控制的任何内容。
因此,用作concept
声明一部分的任何requires
表达式都使用全局上下文来确定它们是否可以访问名称。也就是说,它们只能使用public
接口。
这篇关于在哪个访问控制上下文中评估概念?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在哪个访问控制上下文中评估概念?
基础教程推荐
- 设计字符串本地化的最佳方法 2022-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01