Namespaces
Variants

std:: semiregular

From cppreference.net
ヘッダーで定義 <concepts>
template < class T >
concept semiregular = std:: copyable < T > && std:: default_initializable < T > ;
(C++20以降)

semiregular 概念は、型がコピー可能かつデフォルト構築可能であることを指定します。これは、 == による比較をサポートする必要がないことを除いて、 int のような組み込み型と同様に振る舞う型によって満たされます。

#include <concepts>
#include <iostream>
template<std::semiregular T>
// Credit Alexander Stepanov
// concepts are requirements on T
// Requirement on T: T is semiregular
// T a(b); or T a = b; => copy constructor
// T a; => default constructor
// a = b; => assignment
struct Single
{
    T value;
    // 集約初期化は以下のコンストラクタのように振る舞う:
    // explicit Single(const T& x) : value(x) {}
    // 暗黙的に宣言される特殊メンバ関数は以下の定義のように振る舞うが、
    // 追加のプロパティを持つ場合がある:
    // Single(const Single& x) : value(x.value) {}
    // Single() {}
    // ~Single() {}
    // Single& operator=(const Single& x) { value = x.value; return *this; }
    // 比較演算子は定義されていない; `semiregular` conceptでは要求されない
    // bool operator==(Single const& other) const = delete;
};
void print(std::semiregular auto x)
{
    std::cout << x.value << '\n';
}
int main()
{
    Single<int> myInt1{4};      // 集約初期化: myInt1.value = 4
    Single<int> myInt2(myInt1); // コピーコンストラクタ
    Single<int> myInt3;         // デフォルトコンストラクタ
    myInt3 = myInt2;            // コピー代入演算子
//  myInt1 == myInt2;           // エラー: operator== は定義されていない
    print(myInt1); // OK: Single<int> は `semiregular` 型
    print(myInt2);
    print(myInt3);
}   // Single<int> 変数はここで破棄される

出力:

4
4
4

参考文献

  • C++23標準 (ISO/IEC 14882:2024):
  • 18.6 オブジェクトコンセプト [concepts.object]
  • C++20標準 (ISO/IEC 14882:2020):
  • 18.6 オブジェクトコンセプト [concepts.object]

関連項目

(C++20)
型がregularであることを指定する。つまり、 semiregular かつ equality_comparable である
(コンセプト)