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 上的概念也适用于这段代码,所以不要假设它与编译器相关)。
您的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)
| 归档时间: |
|
| 查看次数: |
60 次 |
| 最近记录: |