这个问题的主要目的是引起社区对 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(使用前将#替换为@)