Мое понимание о Template argument deduction for class templates предложение было гомогенизировать поведение функций шаблона и классов шаблонов в контекстах вычета. Но я думаю, что я должен был что-то не понимать.C++ 17 класс шаблон частичный вывод
Если у нас есть этот шаблон объект:
template <std::size_t S, typename T>
struct test
{
static constexpr auto size = S;
using type_t = T;
test(type_t (&input)[size]) : data(input) {}
type_t (&data)[size]{};
};
Я предпочитаю использовать вспомогательную функцию в качестве синтаксического для создания test
объектов:
template <std::size_t S, typename T>
test<S, T> helper(T (&input)[S]) { return input; }
которые могут быть использованы, как показано ниже:
int main()
{
int buffer[5];
auto a = helper<5, int>(buffer); // No deduction
auto b = helper<5>(buffer); // Type deduced
auto c = helper(buffer); // Type and size deduced
std::cout << a.size << b.size << c.size;
return 0;
}
код выше выходов 555
как и ожидалось. Я пробовал то же самое в Wandbox используя новую установку компилятора :
int main()
{
int buffer[5];
test<5, int> a(buffer); // No deduction: Ok.
test<5> b(buffer); // Type deduced: FAILS.
test c(buffer); // Type and size deduced: Ok.
std::cout << a.size << b.size << c.size;
return 0;
}
Похожи аргументы шаблона дедукции для шаблонов классов работает только выводя все параметры, я Ожидал обоих поведения (вспомогательную функцию и класс шаблон), чтобы быть тем же, я что-то не понял?
В последних составителях в Wandbox Доступными является GCC 7.0.1 ГОЛОВКОЙ 201701 и лязга ГОЛОВКА 5.0.0 (ствол).
Является 'type_t (и данные) [размер] {};' ссылка на массив? Является ли '{}' инициализатором? Скомпилирует ли это? Кроме того, * sintactic sugar * звучит довольно непослушным. :) – wally
Обратите внимание, что [добавление явного * вычитающего руководства *] (http://melpon.org/wandbox/permlink/VEE5DyIE3w3LEGEX) не помогает.Я считаю, что частичный вывод не поддерживается, поскольку в стандарте определяются места размещения вычетов в терминах * имени шаблона * * (т. Е. Без синтаксиса '<...>' *). Поэтому 'test <5>' не является допустимым заполнителем вычетов. –
@Muscampester 'type_t (& data) [size] {};' это ссылка на массив, да. '{}' Действительно инициализатор, и он компилирует [try it out!] (Http://melpon.org/wandbox/permlink/KCkDg5EEIKbZbPU3). О * синтаксическом сахаре * что я могу сказать ...: «(английский не мой родной язык, и я много ошибок!» –