circular_buffer: support non-default-constructible allocators correctly
circular_buffer: support non-default-constructible allocators correctly

Currently, support for default-constructible allocators and non-default-
constructible allocators is mixed in one circular_buffer constructor:

    circular_buffer(Allocator alloc = {})

A problem arises if Allocator is not default-constructible; the compiler
will reject this constructor since if "Allocator alloc = {}" does not
compile, the construct-from-allocator variant won't work wither.

This somehow works with gcc because its checks for default-constructibility
do not check access control; so a private constructor will sneak by. It
breaks in clang.

Fix by separating the two cases, and add a constraint to only allow
the default constructor if the allocator has a default constructor
(which is the usual case).

Add a static assertion that if Allocator's default constructor does exist,
it must be noexcept, as it usually is.

The constraint is added using concepts, even though these are not
guaranteed to be available, since the problem is very rare (it requires
clang + specialized allocator with no default constructor to manifest).
If there are complaints before concepts become mandatory (2023), we'll
add an enable_if version.
Message-Id: <d7cea8b13219ac6ed456db606bf4466766fdc9e8@scylladb.com>

syuu1228/seastar,syuu1228/seastar,cloudius-systems/seastar,dreamsxin/seastar,syuu1228/seastar,dreamsxin/seastar,avikivity/seastar,cloudius-systems/seastar,scylladb/seastar,dreamsxin/seastar,avikivity/seastar,cloudius-systems/seastar,scylladb/seastar,avikivity/seastar,scylladb/seastar