当显式传递模板参数时,函数模板参数丢失 const?

function template parameter loses const when template argument is explicity passed?

template <typename T>
void test(const T& x) {}

int a {};
int& ref = a;
const int& c_ref = a;

test(c_ref)  // T = int, x = const int&
test<int&>(ref); // T = int& , x = int&

为什么函数模板参数 x 丢失 const 限定符?

在显式(非推导)实例化中

test<int&>(ref);

这是您获得的(理论上的)签名

void test<int&>(const (int&)& x)

这表明 const-限定适用于整个 (int&),而不仅仅是 intconst 适用于剩下的东西,如果什么都没有,它适用于右边的东西:int&,但作为一个整体 - 在那里,它适用于 &,同样是因为 const 适用于其左侧的内容。但是没有 const 引用(它们根本不可更改,即它们不能重新绑定),const 被删除,并且引用折叠规则将两个 & 收缩为一.