Не удалось скомпилировать функцию constexpr с переменными аргументами

#c #templates #c 17 #variadic-templates #variadic-functions

Вопрос:

Я пишу constexpr функцию продукта с переменными аргументами. Я смог получить только «Версию 1», работающую ниже. При попытке скомпилировать «Версию 2» я получаю сообщение об ошибке Тип содержит нерасширенный пакет параметров «data_type». Кто-нибудь может объяснить, почему это так?

 /** Version 1. */
template <typename data_type, typename ...data_types>
constexpr data_type Product1(data_type _first, data_types ..._rest) // This code compiles :)
{
  return _first*(_rest * ...);
}

/** Version 2. */
template <typename ...data_type>
constexpr data_type Product2(data_type ..._rest) // This code does not compile :(
{
  return (_rest * ...);
}
 

Ответ №1:

Измените тип возврата на автоматический, тип данных является пакетом и не может использоваться в качестве типа возврата

 template <typename ...data_type>
constexpr auto Product2(const data_typeamp; ..._rest) 
{
    return (_rest * ...);
}

int main()
{
    constexpr auto p = Product2(1, 2, 3);
    return 0;
}
 

Комментарии:

1. Потрясающе, большое спасибо! Порядок во вселенной восстановлен 😀