提问人:larkwiot 提问时间:11/8/2023 最后编辑:user12002570larkwiot 更新时间:11/8/2023 访问量:48
C++20 模板化方法的概念 - 非常量左值引用不能绑定到右值 [duplicate]
C++20 Concept for Templated Method - non const lvalue reference cannot bind to rvalue [duplicate]
问:
我正在尝试编写一个概念来要求给定类型具有模板化方法,但正在努力使该概念认识到我已经正确实现了该方法。
我有一个接口和一个基本实现,定义如下:
template <typename T>
class Other {
public:
virtual auto make() -> T = 0;
};
class Impl : public Other<int> {
public:
auto make() -> int {
return 1;
}
};
我想使一个需要给定类型的概念具有一个模板化方法,该方法可以获取并返回包含的模板化类型的实例。该方法如下所示:Other
Other
class Thing {
public:
template <typename T>
auto some(Other<T>& other) -> T {
return other.make();
}
};
我目前已经写了一个我认为可以这样工作的概念:
template <typename T>
concept IsCorrect = requires (T v) {
{ v.template some(Impl{}) } -> std::same_as<int>;
};
但是添加一个静态断言:
static_assert(IsCorrect<Thing>);
失败时:
<source>:29:15: error: static assertion failed
29 | static_assert(IsCorrect<Thing>);
| ^~~~~~~~~~~~~~~~
<source>:29:15: note: because 'Thing' does not satisfy 'IsCorrect'
<source>:19:18: note: because 'v.template some(Impl{})' would be invalid: no matching member function for call to 'some'
19 | { v.template some(Impl{}) } -> std::same_as<int>;
| ^
1 error generated.
Compiler returned: 1
我怎样才能修复这个概念,让它通过?
Godbolt:https://godbolt.org/z/Y5eeTrado
答: 暂无答案
评论
some
取一个左值,是一个右值。只需将其更改为:godbolt.org/z/j886TdGr7Impl{}