template<typename T>
void f(T a, const T& b)
{
++a; // ok
++b; // also ok!
}
template<typename T>
void g(T n)
{
f<T>(n, n);
}
int main()
{
int n{};
g<int&>(n);
}
请注意:b
是 const T&
且 ++b
没问题!
为什么 const T&
不一定是 const?
最佳答案
欢迎使用 const 和 reference collapsing .当您有 const T&
时,引用将应用于 T
,const
也是如此。你调用 g
喜欢
g<int&>(n);
所以你已经指定 T
是一个 int&
。当我们将一个引用应用到一个左值引用时,两个引用合并为一个,所以 int& &
变成了 int&
。然后我们从 [dcl.ref]/1 得到规则。 ,它指出如果您将 const
应用于引用,它将被丢弃,因此 int& const
只是变成 int&
(请注意,您实际上不能声明 int& const
,它必须来自 typedef 或模板)。这意味着
g<int&>(n);
你真的在打电话
void f(int& a, int& b)
而且你实际上并没有修改常量。
你是否将 g
称为
g<int>(n);
// or just
g(n);
那么 T
将是 int
,而 f
将被标记为
void f(int a, const int& b)
由于 T
不再是一个引用,const
和 &
被应用到它,你会收到一个编译器尝试修改常量变量时出错。
关于c++ - 为什么 `const T&` 不确定是 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54480599/