deductiongu...forstd::list(3)

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

okay bestie, this is the deductiongu...forstd::list(3) page from the C++ Standard Libary manual. Title and manual name folded in right at the top β€” we’re not copying the whole header line, we’re being cute about it. πŸ’…


🌸 NAME 🌸

It’s literally deductionguidesforstd::list β€” and the description is the same exact thing: deductionguidesforstd::list - deductionguidesforstd::list. iconic behavior, honestly. πŸŽ€


✨ Synopsis ✨

Defined in header <list> β€” here’s the whole declaration situation, bestie:

          template< class InputIt,

                    class Alloc = std::allocator<
                        typename std::iterator_traits<InputIt>::value_type>
          >
       (1) (since C++17)
          list( InputIt, InputIt, Alloc = Alloc() )

              -> list<typename std::iterator_traits<InputIt>::value_type,
          Alloc>;
          template< ranges::input_range R,

                    class Alloc = std::allocator<ranges::range_value_t<R>> >
       (2) (since C++23)
          list( std::from_range_t, R&&, Alloc = Alloc() )

              -> list<ranges::range_value_t<R>, Alloc>;
  1. This deduction guide is provided for list to allow deduction from an iterator range. This overload participates in overload resolution only if InputIt satisfies LegacyInputIterator and Alloc satisfies Allocator.
  2. This deduction guide is provided for list to allow deduction from a std::from_range_t tag and an input_range.
Note, and this part is important: 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. that’s the whole caveat, fr fr. 🫢

🧚 Notes 🧚

  • Feature-test macro: __cpp_lib_containers_ranges
  • Value: 202202L
  • Std: (C++23)
  • Feature: Ranges-aware construction and insertion; overload (2)

πŸ’– Example πŸ’–

Run this code, bestie β€” comments are part of the code and we’re keeping them exactly:

       // Run this code

        #include <list>
        #include <vector>

        int main()
        {
            std::vector<int> v = {1, 2, 3, 4};

            // uses explicit deduction guide to deduce std::list<int>
            std::list x(v.begin(), v.end());

            // deduces std::list<std::vector<int>::iterator>
            // first phase of overload resolution for list-initialization
       selects the candidate
            // synthesized from the initializer-list constructor; second phase
       is not performed
            // and deduction guide has no effect
            std::list y{v.begin(), v.end()};
        }

and that’s the page, bestie. footer vibes: source/version http://cppreference.com, date 2024.06.10, for deductiongu...forstd::list(3) β€” mwah πŸ’‹βœ¨

πŸ“¦ where this page comes from