是否存在调用被约束函数隐藏的无约束函数的语法?

Does syntax exist to call an unconstrained function that is hidden by a constrained function?

我理解,对于概念,约束函数(无论约束实际上有多“松散”)总是比不受约束的函数更匹配。但是是否有任何语法可以像下面的示例代码那样有选择地调用 f() 的无约束版本?如果不是,编译器对不可调用的函数发出警告是否是个好主意?

#include <iostream>

template <typename T> requires(true) 
void f() { std::cout << "Constrained\n"; }

template <typename T>
void f() { std::cout << "NOT Constrained\n"; }


int main() {
    f<int>();
}

https://godbolt.org/z/n164aTvd3

一个函数的不同重载都是为了做同样的事情。他们可能以不同的方式或在不同类型的对象上执行此操作,但在概念层面上,一个函数的所有重载都应该做同样的事情。

这包括受限函数。通过将约束重载放入函数重载集中,您声明这是执行该重载集所执行操作的有效替代方法。因此,如果约束匹配,那么这就是应该调用的函数。就像常规函数重载中不同类型的参数一样。

如果您想要显式调用被约束隐藏的重载,那么您的设计就已经做错了。或者更具体地说,如果某些重载完全被一个或多个约束重载隐藏,那么您显然比实际需要的重载多了一个。

如果约束匹配,调用者应该可以 100% 地获得约束重载。如果不是这样,那你的设计就有问题了。

所以不,没有执行此操作的机制。就像没有机制绕过显式专用模板并在您的模板参数与专用化匹配时使用原始版本一样。