繁体   English   中英

header 中的概念不限制 C++20 中的参数包?

[英]concept in header doesn't constrain a parameter pack in C++20?

上下文:我正在将与 GCC -fconcepts 一起使用的库重写为 C++20。 Clang 10 和 GCC 10 给我同样的意外问题,所以这可能是我的错。

我有一个支持两种情况的 class 模板。 它可以从 pin_out 列表创建,也可以从 port_out 列表创建。

template< typename T > concept pin_out = T::is_pin_out;

template< typename... Ts > concept pin_out_list = ( pin_out< Ts > && ... );

template< typename T > concept port_out = T::is_port_out;

template< typename... Ts >
   requires pin_out_list< Ts...> || ( port_out< Ts > && ... )
struct port;

当我用我可以写的概念 TS 编写一个 pin_out 列表的专业化时

template< pin_out_list... Ts > 
struct port< Ts... > {};

但是现在有了 C++20,编译器抱怨专业化并不比基础更受限制。 当我添加一个 requires 子句时,它会编译。

template< pin_out_list... Ts > 
   requires pin_out_list< Ts... >
struct port< Ts... > {};

我可以从模板 header 中删除 pin_out_list...。

template< typename... Ts > 
   requires pin_out_list< Ts... >
struct port< Ts... > {};

现在专业化中的 pin_out_list... 是否被默默地忽略了?

编译器资源管理器上测试它

P1141改变的许多事情之一是可变参数约束的实际含义:

在 [temp.param]/11 我们有:

 template <C2... T> struct s3; // associates C2<T...>

这似乎是在做一件意想不到的事情,即一次将约束应用于一个包中的多个类型。

由于那篇论文,像这样的可变参数约束现在适用于后面的每种类型。 也就是说,我们现在有(现在在[temp.param]/5中):

template <C2... T> struct s3; // associates (C2<T> && ... )

因此,该专业化:

template< pin_out_list... Ts > 
struct port< Ts... > {};

方法:

template <typename... Ts> requires (pin_out_list<Ts> && ...)
struct port<Ts...>;

并不是:

template <typename... Ts> requires pin_out_list<Ts...>
struct port<Ts...>;

您需要后一种含义(这是主表达式中的约束),因此您需要编写后一种语法。 编译器并没有默默地忽略您的专业化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM