This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of Open status.
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_backto the underlying container.
Option B one replaces the calls toemplace_backwith 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
stackdefinition, 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
queuedefinition, 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)...);
}
}