为什么普遍引用不保持其论点的恒定性
Why does universal reference not keep constness of its arguments?
template<typename T>
void f(T&& n)
{
++n; // ok to modify a const object, why?
}
template<typename T>
void g()
{
int n{};
f<const T&>(n);
}
int main()
{
g<int&>();
}
如上面的代码所示。我的问题是:
为什么普遍引用不能保持其论点的恒定性?
确实如此。在您的示例中,您尝试将 const 应用于引用类型本身,而不是 int。如果你在类型后面写 const,你可以看到它更干净:
const T& == T const& == int& const&.
由于 const 在应用于引用类型时不会更改任何内容,因此它只是被忽略。
事实上,如果你在没有模板的情况下编写int& const
,你会得到一个编译错误。但是,模板中允许这样做,因为在某些情况下很难避免此类类型。
另一种看待这个问题的方法是用指针替换引用。如果这样做,您将获得以下类型:
const T* = T const* = int* const*
此类型是指向可变(非常量)int 的不可变 (const) 指针的指针。
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 指针类型类成员的动态强制转换的恒定性是什么?
- 为什么对引用的常量引用会失去其恒定性?
- 对指针和恒常性兼容性的引用
- 引用类型的数据成员提供有关恒常正确性"loophole"
- 运算符的要求<恒定性在标准::stable_sort
- 模板参数推导由于恒定性不一致而失败
- 为什么模板参数失去恒定性?
- 为什么普遍引用不保持其论点的恒定性
- 是否可以使用 SFINAE 检测类方法的恒定性?
- 在模板中强制转换为引用似乎会抛弃恒定性
- 在分配对象时保持恒定性
- 常量成员函数中模板成员的恒定性
- 变量的恒定性及其生存期
- 尊重恒定性,同时避免在堆上重新分配
- const_cast转换为左值引用不会消除恒常性
- 参考类成员的恒定性
- 当函数参数常量引用 T 时,为什么 T 的模板参数推导'skips'数组元素的恒定性?