xml*_*lmx 57 c++ templates const const-reference function-templates
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);
}
Run Code Online (Sandbox Code Playgroud)
请注意:b
是的const T&
,++b
没关系!
为什么const T&
不确定是const?
Nat*_*ica 64
欢迎来到const和引用折叠.如果有const T&
,则引用应用于T
,以及const
.你打电话g
就好
g<int&>(n);
Run Code Online (Sandbox Code Playgroud)
所以你指定的T
是int&
.当我们对左值引用应用引用时,这两个引用会折叠为单个引用,因此int& &
变为公正int&
.然后我们从[dcl.ref]/1获得规则,该规则指出如果你应用于const
引用它会被丢弃,所以int& const
就变成int&
(注意你实际上不能声明int& const
,它必须来自typedef或模板) ).这意味着
g<int&>(n);
Run Code Online (Sandbox Code Playgroud)
你实际上在打电话
void f(int& a, int& b)
Run Code Online (Sandbox Code Playgroud)
而你实际上并没有修改常数.
如果你打电话g
给
g<int>(n);
// or just
g(n);
Run Code Online (Sandbox Code Playgroud)
那T
将是int
,并且f
本来会被标记为
void f(int a, const int& b)
Run Code Online (Sandbox Code Playgroud)
由于T
不再是引用,const
并且&
get应用于它,并且您将尝试修改常量变量时收到编译器错误.