Когда вы заглядываете в исходный код вашей реализации и видите
namespace std {
// Other things
template <typename ... _Tp>
class tuple {
// More things
template <class _Alloc>
LIBCPP_INLINE_VISIBILITY
tuple(allocator_arg_t, const _Alloc& __a, const _Tp& ... __t)
// an implementation of this constructor
};
}
Это является конструктором, который cppreference names
template <class Alloc>
tuple(allocator_arg_t, const Alloc& a, const Types&...);
YourРеализация выбрала использовать имена, которые зарезервированы для его использования.Что именно эти имена не имеют значения для компилятора.
что такое const _Tp& ... __t
?
Это пакет параметров для копирования в кортеж.Для std::tuple<int>
это const int&
, для std::tuple<std::string, bool, char>
это const std::string &, const bool &, const char &
.__t
- это имя пакета параметров.C ++ позволяет шаблонам иметь разное количество параметров.
как насчет tuple(_Up&&... __u)
?
Это перегрузка (3)
Конвертирующий конструктор,Инициализирует каждый элемент кортежа с соответствующим значением в std::forward<UTypes>(args)
.
Эта перегрузка участвует только в разрешении перегрузки, если sizeof...(Types) == sizeof...(UTypes)
и sizeof...(Types) >= 1
и std::is_constructible<Ti, Ui&&>::value
равны true
для всех i
.
Конструктор является явным тогда и только тогда, когда std::is_convertible<Ui&&, Ti>::value
равен false
хотя бы для одного i
.
Например, для std::tuple<int> tup('a');
, tup
будет инициализировансопоставив UTypes...
с char
, и первый член получит числовое значение 'a'
(97 на большинстве платформ).
Обратите внимание, что нет смысла использовать конструктор с поддержкой распределителя для std::tuple<int>
, потому что int
не относится к типу с распределителем.Эти конструкторы существуют для таких случаев, как
using statefully_allocated = std::vector<int, my_stateful_allocator<int>>;
my_stateful_allocator<int> alloc1 = /* something */
statefully_allocated source(alloc);
my_stateful_allocator<int> alloc2 = /* something else */
std::tuple<statefully_allocated, char> tup(std::allocator_arg, alloc2, source, 'a');
, где член statefully_allocated
копирует содержимое source
, но использует для выделения копию alloc2
.char
член - просто обычный char
, alloc2
не играет никакой роли в его конструкции.См. Конструкция использования-распределителя