如何解决应该急切地还是懒惰地评估 C++ 约束?
这个问题的主要目的是引起社区对 libstdc++ 范围不适用于 clang 的关注:https://bugs.llvm.org/show_bug.cgi?id=46746
Avi Kivity 认为这是一个 gcc 错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97120
但随后他也暗示这是一个叮当声错误: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> {};
clang 抱怨 (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 设置工作范围吗?
解决方法
模板的类型约束和要求子句 特化或成员函数不会与 特化或函数本身,即使是一个成员函数 本地类;代入由它们形成的原子约束 而是按照 [temp.constr.decl] 中的规定执行,并且 [temp.constr.atomic] 当确定约束是否为 比较时满足或符合 [temp.constr.decl] 中的规定 声明。
Clang 错误。
,按照 T.C. 的回答中的链接,我在标准中找到了一个相关的例子,那个 clang 拒绝编译。这清楚地表明了 clang 中的一个错误。
template <class T> concept C = true;
template <class T> struct A {
template <class U> U f(U) requires C<typename T::type>; // #1
template <class U> U f(U) requires C<T>; // #2
};
template <> template <class U>
U A<int>::f(U u) requires C<int> { return u; } // OK,specializes #2
<source>:3:49: error: type 'int' cannot be used prior to '::' because it has no members
template <class U> U f(U) requires C<typename T::type>; // #1
^
我为此专门创建了一个错误:https://bugs.llvm.org/show_bug.cgi?id=50864
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。