当显式传递模板参数时,函数模板参数丢失 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&)
,而不仅仅是 int
。 const
适用于剩下的东西,如果什么都没有,它适用于右边的东西:int&
,但作为一个整体 - 在那里,它适用于 &
,同样是因为 const
适用于其左侧的内容。但是没有 const
引用(它们根本不可更改,即它们不能重新绑定),const
被删除,并且引用折叠规则将两个 &
收缩为一.
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&)
,而不仅仅是 int
。 const
适用于剩下的东西,如果什么都没有,它适用于右边的东西:int&
,但作为一个整体 - 在那里,它适用于 &
,同样是因为 const
适用于其左侧的内容。但是没有 const
引用(它们根本不可更改,即它们不能重新绑定),const
被删除,并且引用折叠规则将两个 &
收缩为一.