概念上的 cv 限定符需要表达式参数列表

inf*_*inf 1 c++ c++-concepts c++20

我有以下使用概念的代码:

struct bar {
    void foo() {}
};

template <typename T>
concept Fooable = requires (const T& t) { // const bar& t doesn't support t.foo()
    { t.foo() };
};

template <typename Fooable>
void callfoo(Fooable bar)
{
    bar.foo();
}

int main()
{
    bar b;
    callfoo(b);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望代码不会编译,因为bar不支持调用foo()const 实例。但是它确实编译精细链接

cppreference 上的参数列表描述在这方面没有太大帮助:

参数列表 - 一个逗号分隔的参数列表,就像在函数声明中一样,除了不允许使用默认参数并且它不能以省略号结尾(除了表示包扩展的省略号)。这些参数没有存储、链接或生命周期,仅用于帮助指定需求。这些参数在需求序列的结束 } 之前都在范围内。

我是否误解了 cv 限定符在 requires 表达式参数列表中的用途?我完全错过了什么吗?我对 cppreference 有一些使用通用参考参数的示例感到更加困惑,因此其中必须有一些要点。

我正在使用gcc9with -fconcepts(尽管 gcc trunk 和 clang 与 Godbolt 上的概念也适用于这段代码,所以不要假设它与编译器相关)。

Tim*_*imo 6

您的callfoo函数存在错误。您使用的是类型名,而不是概念。将声明更改为

template <Fooable Foo>
void callfoo(Foo bar)
Run Code Online (Sandbox Code Playgroud)

或者

void callfoo(Fooable auto bar)
Run Code Online (Sandbox Code Playgroud)