这个语句在 C++ 概念中意味着什么以及为什么它不起作用

Kul*_*ulo 0 c++ c++-concepts c++20

我正在尝试 C++20 功能,并且我想用来concept限制模板仅传递具有名为 的成员List且其类型应该为 的类std::vector<int>。这是前言。

要在不使用 的情况下执行此操作concept,我将编写以下代码:

class RandomClass
{
public:
    std::vector<int> List;
};

typename std::enable_if<std::is_same<decltype(T::List), std::vector<int>>::value>::type
func(T& arg)
{
      ...
}

int main()
{
    auto randomObj= RandomClass();
    func(randomObj);
}
Run Code Online (Sandbox Code Playgroud)

我要求 New Bing 使用concept重写它,它给出了以下内容:

template<class T>
concept HasList = requires(T t) {
    { t.List } -> std::same_as<std::vector<int>>;
};

template<class T> requires HasList<T>
void func(T& arg)
Run Code Online (Sandbox Code Playgroud)

但是这段代码无法编译,编译器给出了'func': no matching overloaded function found.

然后我搜索std::same_as用法并尝试了这个:

template<class T>
concept HasList = requires(T t) {
    std::same_as<AddressListType, decltype(T::List)>;
};
Run Code Online (Sandbox Code Playgroud)

这段代码有效。

现在问题如下:

  1. 这些语句中的符号是什么{ t.List } -> std::same_as<std::vector<int>>;意思?我不知道这{}->从哪里来的
  2. 为什么{ t.List } -> std::same_as<std::vector<int>>;不能工作?

fab*_*ian 8

您的概念只有一个小问题:成员变量被视为对向量的引用。使用该概念的以下版本应该可行:

template<class T>
concept HasList = requires(T t) {
    { t.List } -> std::same_as<std::vector<int>&>;
};
Run Code Online (Sandbox Code Playgroud)

请注意,当成员变量类型是对非常量的引用或List是静态成员的情况时,也满足此概念。如果您对这些情况感到困扰,您可能需要修改支票。

template<class T>
concept HasList = requires
{
    { &T::List } -> std::same_as<std::vector<int> T::*>; // check, if the T::List is a pointer to a non-static member variable of type std::vector<int> 
};
Run Code Online (Sandbox Code Playgroud)

在:

{ t.List } -> std::same_as<std::vector<int>>;
Run Code Online (Sandbox Code Playgroud)

t.List是一个表达式,也是std::same_as<std::vector<int>>一个必须满足的概念。具体来说:

std::same_as<X, std::vector<int>>
Run Code Online (Sandbox Code Playgroud)

必须满足作为X表达式的类型t.List