Variadic templates arguments position
От: koenjihyakkei Россия  
Дата: 08.04.20 21:52
Оценка:
#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) {}


Можно ли как то такое починить или это в принципе не должно работать?

Заранее спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.