【发布时间】:2021-07-28 07:23:49
【问题描述】:
加速编译的一种常见做法是只声明类而不是给出它们的完整定义,例如
struct A;
template<typename T> struct B;
using C = B<A>;
如果有人喜欢在模板类中使用 C++20 概念,那么代码如下
#include <concepts>
struct A;
template<std::destructible T> struct B;
using C = B<A>;
会导致错误:
error: template constraint failure for 'template<class T> requires destructible<T> struct B'
| using C = B<A>;
是否有可能以某种方式延迟概念检查的时刻,直到 B<A> 真正使用/实例化?如果不是,那么通过强制包含以前隐藏的类定义,概念似乎会显着减慢某些程序的编译速度。
【问题讨论】:
-
用信息(如概念、继承等)转发声明会很好。
-
static_assertinB而不是它的概念:/ -
这基本上会破坏概念的目的,即及早报告错误。
-
如果可能的话,我可以看到它会导致一些病态的情况。你可以用不完整的类型做事情(
C*、C&甚至C foo( C );都是有效的)。如果编译器没有当场检查它,你最终可能会得到大量引用不存在的类型的代码。好像错了。 -
概念决定专业化是否存在,而不是是否可以完成。在许多情况下,使用不完整的类型,然后当概念还没有发挥作用时就会出现问题
标签: c++ c++20 c++-concepts