为什么普遍引用不保持其论点的恒定性

Why does universal reference not keep constness of its arguments?

本文关键字:恒定性 引用 为什么      更新时间:2023-10-16
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) 指针的指针。