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是在同一个类中声明的吗?或者我有某种语法错误?
存在一个问题:requires类内声明和类外定义中的子句是否等效(或功能等效)。
但无论这个问题的答案如何,最简单的解决方案是简单地使用完全相同的标记序列,这肯定是等效的:
template <typename T>
void Foo<T>::bar() requires (isInt)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
然而,当前的 Clang 版本不接受我尝试命名静态成员的任何变体,尤其是那些在声明和定义中使用相同标记序列的变体。至少最后一部分绝对是一个错误。
但在当前的 Clang 主干上,所有变体都被接受,表明这是最近修复的错误。
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |