在c++中概念检查可以延迟到类实例化吗?



加快编译速度的一个常见做法是只声明类而不给出它们的完整定义,例如

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>真正使用/实例化?如果没有,那么似乎概念将强制包含以前隐藏的类定义,从而显着降低某些程序的编译速度。

这是转发声明的方式。

struct A;
template<class T> struct B;
using C = B<A>;

保持这样。InB.h:

#include <concepts>
template<class T> struct B;
// or
template<class T> struct B
{
static_assert( std::destructible<T> );
};
template<std::destructible T>
struct B<T> {
};

专业。未定义基本B<T>

现在,您得到的错误将不会"早期"检查,而是在稍后的位置出现。因此,将T传递给B<>不会以sfinae友好的方式进行检查。

但这基本上是你在问题中要求不要发生的。

请注意,static_assert在标准的某些读数下可能使您的程序格式错误,不需要诊断。基本上,所有的专门化(包括基专门化)都必须有一个有效的实例化,而其他专门化的模式匹配使得这是不可能的。

但在实践中,我认为你只是得到一个错误信息。

最新更新