当前位置 : 主页 > 编程语言 > c++ >

c – 为什么通用引用不保持其参数的常量?

来源:互联网 收集:自由互联 发布时间:2021-06-23
参见英文答案 Why is `const T` not sure to be const?2个 templatetypename Tvoid f(T n){ ++n; // ok to modify a const object, why?}templatetypename Tvoid g(){ int n{}; fconst T(n);}int main(){ gint();} 如上面的代码所示.我的问题
参见英文答案 > Why is `const T&` not sure to be const?                                    2个

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)指针的指针.

网友评论