По крайней мере, стоило бы сообщить авторам, что текущая реализация ломает вещи.

онимание оВывод аргумента шаблона для шаблонов классов Было предложено унифицировать поведение шаблонных функций и шаблонных классов в контексте дедукции. Но я думаю, что что-то неправильно понял.

Если у нас есть этот шаблон объекта:

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, используя новую настройку компилятора1:

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;
}

Похоже, что вывод аргументов шаблона для шаблонов классов работает только с выводом всех параметров, я ожидал, что оба поведения (вспомогательная функция и шаблон класса) будут одинаковыми, я что-то не так понял?

1Последние доступные компиляторы в Wandboxgcc HEAD 7.0.1 201701 а такжелязг HEAD 5.0.0 (багажник).

Ответы на вопрос(2)

Ваш ответ на вопрос