#include <iostream>
#include <cstdlib>
using namespace std;
struct A {
A(int v) : a(v) {}
int a = 9;
};
template<typename T>
struct B: public T {
template<typename... Args>
B(Args... args, int v) : T(forward<Args>(args)...), b(v) {}
int b;
};
int main()
{
B<A> b(11, 22);
cout << b.a << b.b<< endl;
}
Этот код не компилируется. Но если поменять конструктор В на:
B(int v, Args... args) : T(forward<Args>(args)...), b(v) {}
то все работает.
Почему же в начальном варианте дедукция не срабатывает?
Ведь вроде из сигнатуры конструтора можно вывести количество вариадиков, но получается компилятор считает, что их вообще нет:
prog.cc:26:10: error: no matching constructor for initialization of 'B<A>'
B<A> b(11, 22);
^ ~~~~~~
prog.cc:20:5: note: candidate constructor [with Args = <>] not viable: requires single argument 'v', but 2 arguments were provided
B(Args... args, int v) : T(forward<Args>(args)...), b(v) {}
Можно ли как то такое починить или это в принципе не должно работать?
Заранее спасибо.