Issue 2783: stack::emplace() and queue::emplace() should return decltype(auto) (original) (raw)
This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++20 status.
2783. stack::emplace() and queue::emplace() should return decltype(auto)
Section: 23.6.3.1 [queue.defn], 23.6.6.2 [stack.defn] Status: C++20 Submitter: Jonathan Wakely Opened: 2016-10-14 Last modified: 2021-02-25
Priority: 2
View all other issues in [queue.defn].
View all issues with C++20 status.
Discussion:
The stack and queue adaptors are now defined as:
template <class... Args> reference emplace(Args&&... args) { return c.emplace_back(std::forward(args)...); }
This breaks any code using queue<UserDefinedSequence> or stack<UserDefinedSequence>until the user-defined containers are updated to meet the new C++17 requirements.
If we defined them as returning decltype(auto) then we don't break any code. When used with std::vectoror std::deque they will return reference, as required, but when used with C++14-conforming containers they will return void, as before.
[2016-11-12, Issaquah]
Sat AM: P2
[2017-03-04, Kona]
Status to Tentatively Ready.
Proposed resolution:
This wording is relative to N4606.
- Change return type of
emplacein class definition in 23.6.3.1 [queue.defn]:template <class... Args>
referencedecltype(auto) emplace(Args&&... args) { return c.emplace_back(std::forward(args)...); } - Change return type of
emplacein class definition in 23.6.6.2 [stack.defn]:template <class... Args>
referencedecltype(auto) emplace(Args&&... args) { return c.emplace_back(std::forward(args)...); }