gpt4 book ai didi

c++ - 临时约束需要需要需要需要?

转载 作者:行者123 更新时间:2023-12-04 12:56:22 25 4
gpt4 key购买 nike

假设我正在编写一个类模板,其中一些成员受类型模板参数静态 constexpr 数据成员的存在和值的约束:

template<class T>
struct A {
constexpr bool operator()() requires T::value { return T::value; }
constexpr bool operator()() { return false; }
};
#include <type_traits>
static_assert(A<std::true_type>()());
static_assert(!A<std::false_type>()());
static_assert(!A<void>()());
MSVC 和 gcc 接受这一点,但 clang 拒绝除非我 replace requires T::valuerequires requires { requires T::value; } .这是clang中的错误,还是其他编译器松懈;是C++需要需要需要需要的情况吗?标准怎么说?
相关(嗯,至少⅔): Why do we require requires requires?

最佳答案

这是一个 clang 错误(提交 #49513)。
看起来clang正在替换void进入 T::value并决定因为这是一个无效的表达式,所以约束是无效的。但规则,在 [temp.constr.atomic]就是它:

To determine if an atomic constraint is satisfied, the parameter mapping and template arguments are first substituted into its expression. If substitution results in an invalid type or expression, the constraint is not satisfied.


在这种情况下,替换会导致无效的类型或表达式,因此其结果应该是不满足约束。

请注意,此重载:
constexpr bool operator()() requires T::value { return T::value; }
仅在 T::value 时有效是一个有效的表达式,计算结果为 true .这使得它相当于:
constexpr bool operator()() requires T::value { return true; }
在这种情况下很好,因为您要返回 false无论如何,在其他情况下,所以没有理由区分 T::value存在但为 false来自 T::value不存在。
但认为无论如何都值得澄清。

关于c++ - 临时约束需要需要需要需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66562184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com