最終更新日時: 2026年01月05日 18時09分29秒 (JST)
Koichi Murase が更新

履歴 編集

concept
<concepts>

# std::regular(C++20)

    namespace std {
      template<class T>
      concept regular = semiregular<T> && equality_comparable<T>;
    }

## 概要

`regular`は、任意の型`T`が`semiregular`コンセプトを満たし、それに加えて等値比較可能であることを表すコンセプトである。

## 正則性

正則（regular）な型とはつまり以下の性質を備えた型である。

- ムーブ構築・代入可能
- コピー構築・代入可能
- デフォルト構築可能
- `swap`可能
- `== !=`による等値比較可能

このような正則な型とは、`int`型などの基本型の様に扱うことのできる型を表している。

ここから等値比較可能という性質を弱めたものは、半正則な型と呼ばれる。

## 例

    #include <iostream>
    #include <concepts>

    template<std::regular T>
    void f(const char* name) {
      std::cout << name << " is regular" << std::endl;
    }

    template<typename T>
    void f(const char* name) {
      std::cout << name << " is not regular" << std::endl;
    }

    struct regular {
      regular() = default;
      regular(const regular&) = default;
      regular& operator=(const regular&) = default;

      bool operator==(const regular&) const = default;
    };

    struct semiregular {
      semiregular() = default;
      semiregular(const semiregular&) = default;
      semiregular& operator=(const semiregular&) = default;
    };

    int main() {
      f<int>("int");
      f<double>("double");
      f<std::nullptr_t>("std::nullptr_t");
      f<std::size_t>("std::size_t");
      f<regular>("regular");

      std::cout << "\n";
      f<void>("void");
      f<semiregular>("semiregular");
    }

### 出力

    int is regular
    double is regular
    std::nullptr_t is regular
    std::size_t is regular
    regular is regular

    void is not regular
    semiregular is not regular

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: 10.1 ✅
- Visual C++: 2019 Update 3 ✅

## 関連項目

- C++20 コンセプト

## 参照

- P0898R3 Standard Library Concepts
- P1754R1 Rename concepts to standard_case for C++20, while we still can