c – 为什么`const T&`不确定是const?
作者:互联网
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<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和&得到应用,你会收到编译器错误试图修改常量变量.
标签:function-templates,c,templates,const,const-reference 来源: https://codeday.me/bug/20191004/1851483.html