递归依赖于自身的概念专业化的价值是什么?

时间:2018-12-08 18:19:18

标签: c++ language-lawyer c++-concepts c++20

让我们考虑以下代码:

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分支报告超出了递归模板实例化深度。

0 个答案:

没有答案