【发布时间】:2025-12-27 21:10:06
【问题描述】:
当运行以下代码时,涉及通过一个名为 B 的类的方法更改 int 的值,该类继承自模板类 A,int 的值没有改变,我不明白为什么,我已经用 clang trunk 和 gcc trunk 测试了这两个:
#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};
同样有效,尽管作为 pr 值的 6 无法绑定到左值引用。
所以我的问题是为什么 B 的构造函数选择 Args = [int] 而不是 Args = [int&] 以及当它将该 Args 传递给接受 T& 的构造函数时它如何做到这一点?
【问题讨论】:
-
模板参数推导类似于通过检查羊内脏来预测未来。
标签: c++ templates inheritance