C++ 约束应该急切地评估还是惰性地评估?

2023-11-21

这个问题的主要目的是引起社区对 libstdc++ 范围不适用于 clang 的关注:https://bugs.llvm.org/show_bug.cgi?id=46746

Avi Kivity 认为这是一个 gcc 错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97120

但随后他也暗示这是一个 clang bug:https://bugs.llvm.org/show_bug.cgi?id=47509

Rafael Ávila de Espíndola 将问题归结为以下代码,该代码使用 gcc 进行编译,但不能使用 clang 进行编译:

template <typename _Tp>
concept __member_begin = requires(_Tp __t) {
    {__t.begin()};
};
template <typename _Tp>
concept nothing = requires(_Tp __t) {
    {42};
};
template <typename _Tp>
requires __member_begin<_Tp> void __ranges_begin() {}
template <typename _Derived>
struct view_interface {
    void foo() requires __member_begin<_Derived> {}
    void bar() requires nothing<decltype(__ranges_begin<_Derived>())> {}
};
struct drop_view : public view_interface<drop_view> {};

铿锵抱怨(https://godbolt.org/z/4c45oKMKK):

<source>:14:42: error: no matching function for call to '__ranges_begin'
    void bar() requires nothing<decltype(__ranges_begin<_Derived>())> {}
                                         ^~~~~~~~~~~~~~~~~~~~~~~~

那么问题来了,谁是对的呢?这段代码是否应该编译?

更有趣的问题是:我们可以使用 clang 来设置工作范围吗?


[温度设置]/17:

The 类型约束 and 要求子句模板的 专业化或成员函数不会与 专业化或函数本身,即使是一个成员函数 本地类;代入由它们形成的原子约束 相反,按照 [temp.constr.decl] 中的指定执行并且 [temp.constr.atomic] 确定约束是否为 比较时满足或如 [temp.constr.decl] 中指定 声明。

叮当错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 约束应该急切地评估还是惰性地评估? 的相关文章