重复概念需求检查。我们应该关心他们吗?

Duplication of concept requirement checks. Should we care about them?

函数嵌套时,概念需求检查经常重复。
看下面的例子,

template<typename I>
requires std::forward_iterator<I>
auto fun1(I i){ ... };

template<typename I>
requires std::forward_iterator<I>
auto fun2(I i){
    fun1(i);
    ....
}

fun1 在 fun2 内部被调用,因此 std::forward_iterator<I> 检查了两次。
我想知道这种重复的需求检查是否会对编译时间产生负面影响。
或者您认为我们应该努力减少需求检查的重复吗?
添加 :
我们可以采取一些措施来避免重复要求检查,如下所示,

template<typename I>
auto fun1_unchecked(I i) { ... }

template<typename I>
requires std::forward_iterator<I>
auto fun1(I i) {
    return fun1_unchecked(i);
}

template<typename I>
requires std::forward_iterator<I>
auto fun2(I i) {
    fun1_unchecked(i);
    ...
}

但我不知道这值得付出努力。

如果fun1fun2以外的人调用,那么概念的存在不是重复。仅调用 fun1 的代码也需要一个概念化的接口。它们是两个独立的函数;其中一个恰好打电话给另一个。

如果 fun1 仅由 fun2 调用,则可以删除该概念。但除此之外,它是您系统中有意义的一部分,应该有一个合适的界面。

至于“重复”的 compile-time 成本,该标准为 C++ 实现提供了将成本降至最低所需的所有回旋余地。对于任何给定的类型 T,如果(一个文件的)编译器看到 concept_name<T>,编译器可以自由地假设 concept_name<T> 的每个后续使用都会产生相同的值。所以它可以有效地缓存它。

所以“重复”的任何成本都应该最小化。

Do you think we should endeavor to reduce duplication of requirement checks?

没有。除非您有来自实际编译器的 实际 性能指标告诉您存在实际性能问题。