在 C++ 中,概念检查可以延迟到 class 实例化吗?
Can concept checking be delayed till class instantiation in C++?
加速编译的常见做法是只声明 classes 而不是给出它们的完整定义,例如
struct A;
template<typename T> struct B;
using C = B<A>;
如果喜欢在模板中使用C++20的概念classes那么代码如下
#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>
真的是 used/instantiated?如果不是,那么概念似乎会通过强制包含以前隐藏的 class 定义来显着减慢某些程序的编译速度。
这就是你转发声明的方式。
struct A;
template<class T> struct B;
using C = B<A>;
保留这个。在 B.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
可能会根据标准的某些解读,使您的程序格式错误,无需诊断。基本上所有的特化(包括基本的)都必须有一个有效的实例化,而另一个特化的模式匹配使得这不可能。
但实际上我认为您只会收到一条错误消息。
加速编译的常见做法是只声明 classes 而不是给出它们的完整定义,例如
struct A;
template<typename T> struct B;
using C = B<A>;
如果喜欢在模板中使用C++20的概念classes那么代码如下
#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>
真的是 used/instantiated?如果不是,那么概念似乎会通过强制包含以前隐藏的 class 定义来显着减慢某些程序的编译速度。
这就是你转发声明的方式。
struct A;
template<class T> struct B;
using C = B<A>;
保留这个。在 B.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
可能会根据标准的某些解读,使您的程序格式错误,无需诊断。基本上所有的特化(包括基本的)都必须有一个有效的实例化,而另一个特化的模式匹配使得这不可能。
但实际上我认为您只会收到一条错误消息。