【发布时间】:2019-04-15 05:47:13
【问题描述】:
这个问题是这个one的后续问题
一个概念没有被实例化([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 为真;
【问题讨论】:
-
我猜/希望
b2是false但老实说我不知道。 -
我很想赏金,但担心它可能会带来善意但糟糕的答案。
-
@Oliv:标准中的措辞已更改为“未实例化概念([temp.spec])。[注意:概念ID([temp.names])是评估为表达式。一个概念不能被显式实例化([temp.explicit]),显式特化([temp.expl.spec])或部分特化。-结束注]“,我认为这最终意味着这个概念会影响它的价值(在这种情况下,由于类访问控制)
标签: c++ language-lawyer c++-concepts c++20