为什么通用引用不保持其参数的常量性?
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。如果在 type 后面写 const,你可以看到它更清晰:
const T& == T const& == int& const&.
由于 const 在应用于引用类型时不会改变任何内容,因此它会被忽略。
事实上,如果你在没有模板的情况下编写 int& const
,你会得到一个编译错误。但是在模板中是允许的,因为在某些情况下很难避免这种类型。
另一种看待这个问题的方法是用指针替换引用。如果这样做,您将获得以下类型:
const T* = T const* = int* const*
此类型是指向可变(非常量)int 的不可变(const)指针。
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。如果在 type 后面写 const,你可以看到它更清晰:
const T& == T const& == int& const&.
由于 const 在应用于引用类型时不会改变任何内容,因此它会被忽略。
事实上,如果你在没有模板的情况下编写 int& const
,你会得到一个编译错误。但是在模板中是允许的,因为在某些情况下很难避免这种类型。
另一种看待这个问题的方法是用指针替换引用。如果这样做,您将获得以下类型:
const T* = T const* = int* const*
此类型是指向可变(非常量)int 的不可变(const)指针。