C++20 模板化方法的概念 - 非常量左值引用不能绑定到右值 [duplicate]

C++20 Concept for Templated Method - non const lvalue reference cannot bind to rvalue [duplicate]

提问人:larkwiot 提问时间:11/8/2023 最后编辑:user12002570larkwiot 更新时间:11/8/2023 访问量:48

问:

我正在尝试编写一个概念来要求给定类型具有模板化方法,但正在努力使该概念认识到我已经正确实现了该方法。

我有一个接口和一个基本实现,定义如下:

template <typename T>
class Other {
  public:
    virtual auto make() -> T = 0;
};

class Impl : public Other<int> {
  public:
    auto make() -> int {
        return 1;
    }
};

我想使一个需要给定类型的概念具有一个模板化方法,该方法可以获取并返回包含的模板化类型的实例。该方法如下所示:OtherOther

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

C++ 模板 20 C+ +-概念

评论

0赞 Patrick Roberts 11/8/2023
some取一个左值,是一个右值。只需将其更改为:godbolt.org/z/j886TdGr7Impl{}
0赞 larkwiot 11/8/2023
谢谢!这似乎有效,您想将其添加为答案吗?

答: 暂无答案