Deducción parcial de plantilla de clase C ++ 17

Mi entendimiento sobre elDeducción de argumentos de plantilla para plantillas de clase La propuesta era homogeneizar el comportamiento de las funciones de plantilla y las clases de plantilla en contextos de deducción. Pero creo que he entendido mal algo.

Si tenemos este objeto de plantilla:

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

Tiendo a usar una función auxiliar comoazúcar sintáctica Para creartest objetos:

template <std::size_t S, typename T>
test<S, T> helper(T (&input)[S]) { return input; }

Que se puede usar como se muestra a continuación:

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

El código anterior da salida555 como se esperaba. He intentado lo mismo en Wandbox usando la nueva configuración del compilador1:

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

Parece que la deducción de argumentos de plantilla para plantillas de clase solo funciona deduciendo todos los parámetros, esperaba que ambos comportamientos (función auxiliar y plantilla de clase) fueran iguales, ¿entendí mal algo?

1Los últimos compiladores disponibles en Wandbox songcc HEAD 7.0.1 201701 yclang HEAD 5.0.0 (tronco).

Respuestas a la pregunta(2)

Su respuesta a la pregunta