[英]Why is `const T&` not sure to be 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和引用折叠 。 当你有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
和&
get应用于它,并且您将尝试修改常量变量时收到编译器错误。
我知道已经有一个已经接受的答案是正确的,但只是添加一点,甚至在模板领域之外,只是在函数声明中...
( const T& )
是不一样的
( const T )
在与第一个匹配的示例中,您有一个const引用。 如果您真的想要一个不可修改的const值,请删除第二个示例中的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.