Container
也应该接受
cv
-
裁判
合格类型,例如
list&&
,
violate list
等,因此您可以使用原始概念来了解实现细节并对其进行包装(
c.begin()
/
c.end()
应该完全返回
C::iterator
):
template <typename C>
concept ContainerImpl = std::copy_constructible<C> &&
requires(C c, const C cc) {
typename C::value_type;
typename C::reference;
typename C::const_reference;
typename C::iterator;
typename C::const_iterator;
typename C::difference_type;
typename C::size_type;
{ c.begin() } -> std::same_as<typename C::iterator>;
{ c.end() } -> std::same_as<typename C::iterator>;
{ c.cbegin() } -> std::same_as<typename C::const_iterator>;
{ c.cend() } -> std::same_as<typename C::const_iterator>;
{ cc.begin() } -> std::same_as<typename C::const_iterator>;
{ cc.end() } -> std::same_as<typename C::const_iterator>;
};
template <typename C>
concept Container = ContainerImpl<std::remove_cvref_t<C>>;