This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++23 status.
Allocator to be usefulSection: 23.6.8.2 [flat.map.defn], 23.6.9.2 [flat.multimap.defn] Status: C++23 Submitter: Johel Ernesto Guerrero Peña Opened: 2022-09-25 Last modified: 2023-11-22
Priority: 2
View all other issues in [flat.map.defn].
View all issues with C++23 status.
Discussion:
This originated from the editorial issue #5800.
P0429R9 added some deduction guides with a non-defaultedAllocator
template parameter and a corresponding function parameter that is defaulted. Since the
template parameter Allocator is not defaulted, these deduction guides are never used.
[2022-09-28; LWG telecon]
We should not just ignore the allocator, it should be rebound and used for the two container types.
Previous resolution [SUPERSEDED]:
This wording is relative to N4917.
Modify 23.6.8.2 [flat.map.defn], class template
flat_mapsynopsis, as indicated:[…] template<ranges::input_range R, class Compare = less<range-key-type<R>>, class Allocator > flat_map(from_range_t, R&&, Compare = Compare(), Allocator = Allocator()) -> flat_map<range-key-type<R>, range-mapped-type<R>, Compare>; […]Modify 23.6.9.2 [flat.multimap.defn], class template
flat_multimapsynopsis, as indicated:[…] template<ranges::input_range R, class Compare = less<range-key-type<R>>, class Allocator > flat_multimap(from_range_t, R&&, Compare = Compare(), Allocator = Allocator()) -> flat_multimap<range-key-type<R>, range-mapped-type<R>, Compare>; […]
[2022-10-19; Jonathan provides improved wording]
Previous resolution [SUPERSEDED]:
This wording is relative to N4917.
Modify 23.6.1 [container.adaptors.general] as indicated:
-8- The following exposition-only alias templates may appear in deduction guides for container adaptors:
template<class Container> using cont-key-type = // exposition only remove_const_t<typename Container::value_type::first_type>; template<class Container> using cont-mapped-type = // exposition only typename Container::value_type::second_type;Modify 23.6.8.2 [flat.map.defn], class template
flat_mapsynopsis, as indicated:[…] template<ranges::input_range R, class Compare = less<range-key-type<R>>, class Allocator > flat_map(from_range_t, R&&, Compare = Compare(), Allocator = Allocator()) -> flat_map<range-key-type<R>, range-mapped-type<R>, Compare >; template<ranges::input_range R, class Allocator> flat_map(from_range_t, R&&, Allocator) -> flat_map<range-key-type<R>, range-mapped-type<R> >; […]Modify 23.6.9.2 [flat.multimap.defn], class template
flat_multimapsynopsis, as indicated:[…] template<ranges::input_range R, class Compare = less<range-key-type<R>>, class Allocator > flat_multimap(from_range_t, R&&, Compare = Compare(), Allocator = Allocator()) -> flat_multimap<range-key-type<R>, range-mapped-type<R>, Compare >; template<ranges::input_range R, class Allocator> flat_multimap(from_range_t, R&&, Allocator) -> flat_multimap<range-key-type<R>, range-mapped-type<R> >; […]Modify 23.6.11.2 [flat.set.defn], class template
flat_setsynopsis, as indicated:[…] template<ranges::input_range R, class Compare = less<ranges::range_value_t<R>>, class Allocator = allocator<ranges::range_value_t<R>>> flat_set(from_range_t, R&&, Compare = Compare(), Allocator = Allocator()) -> flat_set<ranges::range_value_t<R>, Compare >; template<ranges::input_range R, class Allocator> flat_set(from_range_t, R&&, Allocator) -> flat_set<ranges::range_value_t<R>, less<ranges::range_value_t<R>> >; […]Modify 23.6.12.2 [flat.multiset.defn], class template
flat_multisetsynopsis, as indicated:[…] template<ranges::input_range R, class Compare = less<ranges::range_value_t<R>>, class Allocator = allocator<ranges::range_value_t<R>>> flat_multiset(from_range_t, R&&, Compare = Compare(), Allocator = Allocator()) -> flat_multiset<ranges::range_value_t<R>, Compare >; template<ranges::input_range R, class Allocator> flat_multiset(from_range_t, R&&, Allocator) -> flat_multiset<ranges::range_value_t<R>, less<ranges::range_value_t<R>> >; […]
[2023-01-11; Jonathan Wakely provides improved wording]
During LWG telecon Tim pointed out that because
allocator<void> does not meet the Cpp17Allocator
requirements, it might not "qualify as an allocator" and so would cause
the deduction guides to not participate in overload resolution, as per
23.6.1 [container.adaptors.general] p6 (6.4).
Use allocator<byte> instead.
[Issaquah 2023-02-07; LWG]
Edited proposed resolution to fix missing in guides for maps. Move to Immediate for C++23
[2023-02-13 Approved at February 2023 meeting in Issaquah. Status changed: Immediate → WP.]
Proposed resolution:
This wording is relative to N4917.
Modify 23.6.1 [container.adaptors.general] as indicated:
Modify 23.6.8.2 [flat.map.defn], class template flat_map synopsis, as indicated:
[…]
template<ranges::input_range R, class Compare = less<range-key-type<R>>,
class Allocator >
flat_map(from_range_t, R&&, Compare = Compare(), Allocator = Allocator())
-> flat_map<range-key-type<R>, range-mapped-type<R>, Compare
>;
template<ranges::input_range R, class Allocator>
flat_map(from_range_t, R&&, Allocator)
-> flat_map<range-key-type<R>, range-mapped-type<R>
>;
[…]
Modify 23.6.9.2 [flat.multimap.defn], class template flat_multimap synopsis, as indicated:
[…]
template<ranges::input_range R, class Compare = less<range-key-type<R>>,
class Allocator >
flat_multimap(from_range_t, R&&, Compare = Compare(), Allocator = Allocator())
-> flat_multimap<range-key-type<R>, range-mapped-type<R>, Compare
>;
template<ranges::input_range R, class Allocator>
flat_multimap(from_range_t, R&&, Allocator)
-> flat_multimap<range-key-type<R>, range-mapped-type<R>
>;
[…]
Modify 23.6.11.2 [flat.set.defn], class template flat_set synopsis, as indicated:
[…]
template<ranges::input_range R, class Compare = less<ranges::range_value_t<R>>,
class Allocator = allocator<ranges::range_value_t<R>>>
flat_set(from_range_t, R&&, Compare = Compare(), Allocator = Allocator())
-> flat_set<ranges::range_value_t<R>, Compare
>;
template<ranges::input_range R, class Allocator>
flat_set(from_range_t, R&&, Allocator)
-> flat_set<ranges::range_value_t<R>, less<ranges::range_value_t<R>>
>;
[…]
Modify 23.6.12.2 [flat.multiset.defn], class template flat_multiset synopsis, as indicated:
[…]
template<ranges::input_range R, class Compare = less<ranges::range_value_t<R>>,
class Allocator = allocator<ranges::range_value_t<R>>>
flat_multiset(from_range_t, R&&, Compare = Compare(), Allocator = Allocator())
-> flat_multiset<ranges::range_value_t<R>, Compare
>;
template<ranges::input_range R, class Allocator>
flat_multiset(from_range_t, R&&, Allocator)
-> flat_multiset<ranges::range_value_t<R>, less<ranges::range_value_t<R>>
>;
[…]