emplace_back
but don't require itSection: 23.6.6 [stack], 23.6.3 [queue] Status: Open Submitter: Marshall Clow Opened: 2018-10-02 Last modified: 2020-05-09
Priority: 3
View all other issues in [stack].
View all issues with Open status.
Discussion:
23.6.6 [stack] p1 says:
Any sequence container supporting operationsback()
,push_back()
andpop_back()
can be used to instantiatestack
.
but then in 23.6.6.2 [stack.defn] we have the following code:
template<class... Args> decltype(auto) emplace(Args&&... args) { return c.emplace_back(std::forward<Args>(args)...); }
The same pattern appears in 23.6.3 [queue].
I see two ways to resolve this:
The first is to add emplace_back()
to the list of requirements for underlying containers for stack
and queue
The second is to replace the calls to c.emplace_back(std::forward<Args>(args)...)
with c.emplace(c.end(), std::forward<Args>(args)...)
. We can do this w/o messing with the list above because emplace
is part of the sequence container requirements, while emplace_back
is not. I checked the libc++ implementation of vector
, deque
, and list
, and they all do the same thing for emplace(end(), ...)
and emplace_back(...)
.
[2019-02; Kona Wednesday night issue processing]
Status to Open; Casey to provide updated wording, and re-vote on reflector.
Polls were: NAD - 5-1-3; "Option B" - 2-5-2 and "Probe the container" - 7-2-0
Previous resolution [SUPERSEDED]:This wording is relative to N4762.
I have prepared two mutually exclusive options.
Option A a requirement foremplace_back
to the underlying container.
Option B one replaces the calls toemplace_back
with calls toemplace
.Option A
Edit 23.6.6 [stack], as indicated:
Any sequence container supporting operations
back()
,push_back()
,emplace_back()
andpop_back()
can be used to instantiatestack
.Edit 23.6.3.1 [queue.defn], as indicated:
Any sequence container supporting operations
front()
,back()
,push_back()
,emplace_back()
andpop_front()
can be used to instantiatequeue
.Option B
Edit 23.6.6.2 [stack.defn], class template
stack
definition, as indicated:template<class... Args> decltype(auto) emplace(Args&&... args) { return c.emplace_back(c.end(), std::forward<Args>(args)...); }Edit 23.6.3.1 [queue.defn], class template
queue
definition, as indicated:template<class... Args> decltype(auto) emplace(Args&&... args) { return c.emplace_back(c.end(), std::forward<Args>(args)...); }
[2020-05 Casey provides new wording]
This is the "probe for emplace_back
with fallback to emplace
" approach that LWG
wanted to see wording for in Kona.
[2020-05-09; Reflector prioritization]
Set priority to 3 after reflector discussions.
Proposed resolution:
This wording is relative to N4861.
Edit 23.6.6.2 [stack.defn], class template stack
definition, as indicated:
template<class... Args> decltype(auto) emplace(Args&&... args) { if constexpr (requires { c.emplace_back(std::forward<Args>(args)...); }) { return c.emplace_back(std::forward<Args>(args)...); } else { return c.emplace(c.end(), std::forward<Args>(args)...); } }
Edit 23.6.3.1 [queue.defn], class template queue
definition, as indicated:
template<class... Args> decltype(auto) emplace(Args&&... args) { if constexpr (requires { c.emplace_back(std::forward<Args>(args)...); }) { return c.emplace_back(std::forward<Args>(args)...); } else { return c.emplace(c.end(), std::forward<Args>(args)...); } }