Чтобы понять вопрос, сначала прочитайте этот ответ.
Я проверил различные исторические реализации make_tuple
(включая версии clang 2012 года). До C++17 я ожидал, что они будут return {list of values ... }
, но все они создают кортеж перед его возвратом. Все они соответствуют очень упрощенному текущему примеру cppreference:
template <class... Types>
auto make_tuple(Types&&... args)
{
return std::tuple<special_decay_t<Types>...>(std::forward<Types>(args)...);
}
Это не так, но точка возврата инициализации фигурной скобки состоит в том, чтобы напрямую построить возвращаемый объект. До C++17 не существовало гарантированного удаления копии, которое удаляло бы временные файлы даже концептуально. Но даже с C++17 я не ожидал, что фигурные скобки исчезнут в этом примере.
Почему здесь нет фигурных скобок ни в одной из реализаций С++ 11/14? Другими словами, почему бы и нет
template <class... Types>
std::tuple<special_decay_t<Types>...> make_tuple(Types&&... args)
{
return {std::forward<Types>(args)...};
}
auto
. - person aschepler   schedule 31.01.2018std::tuple
. Не могли бы вы создать правило, согласно которому список инициализации в фигурных скобках дляauto
приводит кstd::tuple
? Можно, но в C++ такого правила нет. - person Sam Varshavchik   schedule 31.01.2018auto
не заменяется наstd::tuple<special_decay_t<Types>...>
, а затем в операторе return используется список инициализации в фигурных скобках. Вы должны отредактировать вопрос, чтобы уточнить это. - person Praetorian   schedule 31.01.2018auto
иreturn tuple...
и комбинацииtuple
иreturn {...}
, а последующие абзацы могли относиться к комбинациям. - person   schedule 31.01.2018