std::semiregular - cppreference.com (original) (raw)

The semiregular concept specifies that a type is both copyable and default constructible. It is satisfied by types that behave similarly to built-in types like int, except that they need not support comparison with ==.

[edit] Example

#include #include   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; // Aggregation initialization for Single behaves like following constructor: // explicit Single(const T& x) : value(x) {}   // Implicitly declared special member functions behave like following definitions, // except that they may have additional properties: // Single(const Single& x) : value(x.value) {} // Single() {} // ~Single() {} // Single& operator=(const Single& x) { value = x.value; return *this; } // comparison operator is not defined; it is not required by semiregular concept // bool operator==(Single const& other) const = delete; };   void print(std::semiregular auto x) { std::cout << x.value << '\n'; }   int main() { Single myInt1{4}; // aggregate initialization: myInt1.value = 4 Single myInt2(myInt1); // copy constructor Single myInt3; // default constructor myInt3 = myInt2; // copy assignment operator // myInt1 == myInt2; // Error: operator== is not defined   print(myInt1); // ok: Single is a semiregular type print(myInt2); print(myInt3);   } // Single variables are destroyed here

Output:

[edit] References

[edit] See also