C++ 概念中的类型要求 (C++20)

Igo*_*pov 1 c++ c++-concepts c++20

我正在使用 g++ 10 学习 C++20 标准的新实现概念。我坚持一个简单的类型要求。即我想实现模板参数T具有T::inner成员名称的要求。这是我的错误代码。这个简单的代码有什么问题以及如何修复它?

#include<concepts>

template<typename T>
concept ContainsInner = requires
{
  typename T::inner;
};

template<ContainsInner T>
struct S{};

struct Q
{
  int inner;
};

int main()
{
  S<Q> s;     // instantiate S with Q for template type, 
              // which must satisfy the ContainsInner concept.
              // Q indeed contains the inner name but still the compilation fails
}
Run Code Online (Sandbox Code Playgroud)

Bar*_*rry 5

这个:

template<typename T>
concept ContainsInner = requires
{
  typename T::inner;
};
Run Code Online (Sandbox Code Playgroud)

要求T具有名为的类型inner。哪个 gcc 在它的错误中告诉你:

source>:6:12: note: the required type 'typename T::inner' is invalid
    6 |   typename T::inner;
      |   ~~~~~~~~~^~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

Q没有一个类型命名inner。如果您想要一个名为的成员变量inner,那么您需要:

template<typename T>
concept ContainsInner = requires(T t) {
    t.inner;
};
Run Code Online (Sandbox Code Playgroud)

请注意,这甚至不检查它是什么类型,只是检查它存在。这不是很有用。也许你想要求它是一个int

template<typename T>
concept ContainsInner = requires(T t) {
    { t.inner } -> std::same_as<int&>;
};
Run Code Online (Sandbox Code Playgroud)