deductiongu...rstd::queue(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’… NAME πŸ’…

deductionguidesforstd::queue β€” like, literally the deduction guides for std::queue, no cap, that's the whole name 🫢

This page lives in the C++ Standard Libary manual, and it's deductiongu...rstd::queue(3) if you're the kind of icon who needs the exact lookup string ✨


🌸 Synopsis 🌸

Okay bestie, first things first β€” this whole situation is Defined in header <queue> πŸ’–

template< class Container >
queue( Container )

(1) (since C++17)

-> queue<typename Container::value_type, Container>;
template< class Container, class Alloc >
queue( Container, Alloc )

(2) (since C++17)

-> queue<typename Container::value_type, Container>;
template< class InputIt >
queue( InputIt, InputIt )

(3) (since C++23)

-> queue<typename std::iterator_traits<InputIt>::value_type>;
template< class InputIt, class Alloc >
queue( InputIt, InputIt, Alloc )

(4) (since C++23)

-> queue<typename std::iterator_traits<InputIt>::value_type,
   std::deque<typename std::iterator_traits<InputIt>::value_type, Alloc>>;
template< ranges::input_range R >
queue( std::from_range_t, R&& )

(5) (since C++23)

-> queue<ranges::range_value_t<R>>;
template< ranges::input_range R, class Allocator >
queue( std::from_range_t, R&&, Allocator )

(6) (since C++23)

-> queue<ranges::range_value_t<R>,
   std::deque<ranges::range_value_t<R>, Allocator>>;

So here's the tea β˜• β€” these deduction guides are provided for queue to allow deduction from the underlying container type. That's the whole point, and honestly? Iconic behaviour.

  1. Deduces the underlying container type from the argument. Simple. Clean. Slay. πŸ’…
  2. Same as (1), except that the allocator is provided. She brought a friend 🫢
  3. Deduces the element type from the iterator, using std::deque<typename std::iterator_traits<InputIt>::value_type> as the underlying container type.
  4. Same as (3), except that the allocator is provided.
  5. Deduces the element type from a std::from_range_t tag and an input_range.
  6. Same as (5), except that the allocator is provided. Allocator girlies stay winning πŸ‘‘

✨ When do these even show up tho ✨

These overloads participate in overload resolution only if ⬇️

  • InputIt (if it exists) satisfies LegacyInputIterator,
  • Container (if it exists) does not satisfy Allocator,
  • for (3) (until C++23) (4) (since C++23), Alloc satisfies Allocator, and
  • std::uses_allocator_v<Container, Alloc> is true if both Container and Alloc exist.
🚨 Note, and pls actually read this one: the extent to which the library determines that a type does not satisfy LegacyInputIterator is unspecified, except that as a minimum integral types do not qualify as input iterators. Likewise, the extent to which it determines that a type does not satisfy Allocator is unspecified, except that as a minimum the member type Alloc::value_type must exist and the expression std::declval<Alloc&>().allocate(std::size_t{}) must be well-formed when treated as an unevaluated operand. Big words, huge meaning, don't skip her 😭

πŸ¦‹ Notes πŸ¦‹

Feature-test macro moment, bestie β€” this is the ✨ receipts ✨ section πŸŽ€

  • __cpp_lib_adaptor_iterator_pair_constructor β€” value 202106L, std (C++23), feature: Iterator pair constructors for std::queue and std::stack; overloads (2) and (4)
  • __cpp_lib_containers_ranges β€” value 202202L, std (C++23), feature: Ranges-aware construction and insertion; overloads (5) and (6)

Like, the way these macros are literally just sitting there documenting which overloads ate πŸ’€πŸ”₯


🌈 Example 🌈

// Run this code

#include <queue>
#include <vector>

int main()
{
    std::vector<int> v = {1, 2, 3, 4};
    std::queue s{v}; // guide #1 deduces std::queue<int, vector<int>>
}

Look at her go 😭 guide #1 doing all the work, deducing std::queue<int, vector<int>> from a single brace-init. Main character energy fr fr πŸ’œ


Okay that's the whole page, bestie β€” go forth and let the compiler do the deducing for you, you absolute genius πŸ§šβ€β™€οΈπŸ’–

Pssst, this one's from cppreference at http://cppreference.com, dated 2024.06.10, and it's the deductiongu...rstd::queue(3) page β€” cite her correctly or she'll haunt your build logs πŸ”₯πŸ‘‘
πŸ“¦ where this page comes from