需要模板说明符在概念上将类型视为依赖模板名称 requires 子句

Need of template specifier to treat a type as a dependent template name in concept requires clause

提问人:Fareanor 提问时间:10/10/2023 更新时间:10/10/2023 访问量:92

问:

免責聲明:这个问题纯粹是出于好奇,我不打算使用这样的结构(我什至想不出这样一个概念的相关用例)。


如果我们考虑以下概念(以表示具有定义的内部模板类型的约束):

template <typename T, typename U>
concept has_template_type = requires(T)
{
    typename T::template type<U>;
};

我注意到,如果我删除子句中的说明符(即如果我改写),++ 仍然接受这个概念,而 拒绝它,并附上以下内容:templaterequirestypename T::type<U>;

<source>:4:18: error: use 'template' keyword to treat 'type' as a dependent template name
   4 |     typename T::type<U>;
     |                 ^
     |                 template 
1 error generated.

Live example

GCC 是否正确/允许隐式推断出这是一个依赖模板名称?type

虽然我怀疑 Clang 是对的,但我想得到确认并知道为什么。

g clang++ c++ 模板 语言律师 20 C+ +-概念

评论

1赞 NathanOliver 10/10/2023
我知道规则最近发生了变化,在某些情况下不再需要,但我不记得细节了。这是指向拟议更改的链接:open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0634r3.htmltypename
0赞 Fareanor 10/10/2023
@NathanOliver 这很有趣,我不知道。(即使我的问题是关于放弃而不是:D)templatetypename
0赞 Yksisarvinen 10/10/2023
@NathanOliver clang 声称从第 16 版开始支持这篇论文,不确定是否是它。
0赞 user17732522 10/10/2023
@NathanOliver 此处使用的关键字的含义与您所指的关键字不同。这是 requires-clauses类型要求语法的一部分,而不是用作类型说明符typename-specifier 中的一部分。这两者是无关的。它们可能是不同的关键字。在任何情况下,这里都是绝对必要的,因为它引入了一个与没有它完全不同含义的要求。typenametypenametypename
2赞 Barry 10/11/2023
@BrianBi我昨天为此打开了 CWG 问题请求:github.com/cplusplus/CWG/issues/436

答: 暂无答案