为什么"const T&"不确定是常量?
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 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
和&
将应用于它,并且您可能会因为试图修改常量变量而收到编译器错误。
我知道已经有一个公认的答案是正确的,但只是添加一点,即使在模板领域之外,通常也只是在函数声明中。。。
( const T& )
与不同
( const T )
在与第一个匹配的示例中,您有一个const引用。如果您确实想要一个不可修改的常量值,请删除引用,如第二个示例所示。
相关文章:
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 不确定如何装饰我的C++库代码以在 C 中使用
- C++功能泄漏内存,我是C++新手,不确定如何解决
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 为什么以下代码是不确定的?
- 编译错误:"lvalue required as left operand of assignment" 不确定原因
- 误用指针会产生分段错误。我仍然不确定如何纠正它
- 我不确定为什么代码没有运行,它在编译时抛出错误,说它无法找到 PrintArray()
- 不确定出了什么问题(字符串输入)
- C++睡眠时间不确定
- 在C++中做一个场景问题,我不确定如何处理布尔和if循环
- 代码输出随机符号,我不确定出了什么问题
- const_cast<字符 *>(字符* 常量) 不是左值?
- 可变值变化,不确定原因
- 有没有办法让C++从 cin 中接收不确定数量的字符串?
- 尝试一次将单个字符读取到大小不确定的数组中
- 为什么"const T&"不确定是常量?
- 不确定 c++ 中的常量函数是什么
- C++常量投射,不确定这是否安全