При запуске следующего кода, который включает в себя изменение значения int с помощью метода класса с именем B, который наследуется от шаблонного класса A, значение int не изменяется, и я не могу понять, почему, Я проверил оба из них со стволом Clang и стволом GCC:
#include <iostream>
template<typename T>
struct A
{
A(T& a_num_) : a_num(a_num_) {}
T& a_num;
};
struct B : public A<int>
{
template<typename... Args>
B(Args... args) : A<int>(args...) {}
void do_something()
{
a_num = 1634;
}
};
int main(void)
{
int num = 4;
B b {num};
b.do_something();
std::cout << num;
return 0;
}
Я бы ожидал получить 1634 отпечатка, но вместо 4 отпечатков.
Я сузил ошибку до конструктора B, потому что если я изменю конструктор B на:
B(int& x) : A<int>(x) {}
тогда появляется правильное значение, но текущий конструктор также должен получать int, потому что, когда я набираю:
B b {num};
Тогда ему следует выбрать Args = [int &], потому что это единственный способ удовлетворить конструктор A, который принимает T &, так что же здесь происходит? Что такое a_num в этом случае? Просто ссылка на мусор, которая ничего не ссылается, или, возможно, временный объект?
Я также пытался переписать функцию do_something как
A<int>::a_num = 1634
но его все равно не удалось изменить.
Я также заметил, что объявление b как:
B b {6};
Также работает, хотя нет способа 6, который является значением pr, мог бы связываться со ссылкой на значение l.
Так что мой вопрос здесь заключается в том, почему конструктор B выбирает Args = [int] вместо Args = [int &] и как он может это сделать, когда затем передает Args конструктору, который принимает T &?