为什么成员函数不能要求同一类的 static constexpr 成员为 true?

tir*_*fes 6 c++ constexpr c++20 requires-clause

我尝试让成员函数要求静态 constexpr 布尔成员为 true。这对于 DRY 一个相当复杂的需求非常有帮助。我不知道编译器不允许我这样做的原因。

要求稍微不那么复杂的最小示例:

template <typename T>
struct Foo
{
    static constexpr bool isInt = std::integral<T>;
    void bar() requires (isInt);
    void goo() requires std::integral<T>;
};

template <typename T>
void Foo<T>::bar() requires (Foo<T>::isInt) // error: out-of-line definition of 'bar' does not match any declaration in 'Foo<T>' x86-64 clang 14.0.0 #1
{
    // ...
}

template <typename T>
void Foo<T>::goo() requires std::integral<T> // ok
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这是因为isInt是在同一个类中声明的吗?或者我有某种语法错误?

use*_*522 3

存在一个问题:requires类内声明和类外定义中的子句是否等效(或功能等效)。

但无论这个问题的答案如何,最简单的解决方案是简单地使用完全相同的标记序列,这肯定是等效的:

template <typename T>
void Foo<T>::bar() requires (isInt)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

然而,当前的 Clang 版本不接受我尝试命名静态成员的任何变体,尤其是那些在声明和定义中使用相同标记序列的变体。至少最后一部分绝对是一个错误。

但在当前的 Clang 主干上,所有变体都被接受,表明这是最近修复的错误。