让我们考虑以下代码:
template<class T>
concept Range = requires(T& v){
{begin(v)};
{end(v)};
};
namespace defaults{
template<class T>
auto begin(T& v) -> decltype(v.begin());
template<class T>
auto end(T& v) -> decltype(v.end());
}
//naive "customization points"!
auto begin(Range auto& v){
defaults::begin(v);
}
auto end(Range auto& v){
defaults::end(v);
}
struct my_range{
int * begin();
int * end();
} rng;
auto it = begin(rng); //BOOM
在Range
的概念定义中,ADL为类型begin(Range auto& v)
的自变量找到了模板函数my_range
。因此,begin(v)
的良好状态取决于Range<my_range>
,而Range<my_range>
则取决于begin(v)
良好状态。
在这种情况下应该报告什么编译器?
gcc 8.2(概念TS)崩溃,实现概念的clang分支报告超出了递归模板实例化深度。