我有一些代码,如下所示:
#include <iterator>
#include <list>
#include <vector>
template<std::forward_iterator Iter>
auto less(Iter i1, Iter i2)
{
return i1 < i2;
}
int main()
{
auto vec = std::vector<int>();
auto list = std::list<int>();
(void) less(vec.begin(), vec.end());
//(void) less(list.begin(), list.end()); // error: no match for 'operator<'
}
基本上,
less
模板函数规定Iter
模板参数必须满足前向迭代器的要求,而实现则使用随机访问迭代器提供的operator<
。
该代码的运行是偶然的,因为它只使用了
vector
。是否有编译器警告、静态分析工具或其他任何可以帮助检测需要比其声明更严格概念的函数?
我意识到这可以通过单元测试来检测,但最好有一个工具来指导大型代码库中的测试/修复工作。
我认为这里最好的做法是将样式更改为需要类型所需的所有内容的语句,而不是假设总是存在匹配的标准概念。这样您就可以查看代码并知道它会起作用。 所以你的代码是
template<typename Iter>
requires(
requires(Iter a, Iter b){a < b;}
)
auto less(Iter i1, Iter i2)
{
return i1 < i2;
}
它有点冗长,但它非常清楚你想在这里做什么,并且没有“意外工作”的空间。