xml*_*lmx 3 c++ templates c++11 type-deduction forwarding-reference
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&>();
}
Run Code Online (Sandbox Code Playgroud)
如上面的代码所示.我的问题是:
为什么通用引用不保持其参数的常量?
小智 6
确实如此.在您的示例中,您尝试将const应用于引用类型本身,而不是int.如果在类型后面写const,你可以看到它更清晰:
const T& == T const& == int& const&.
Run Code Online (Sandbox Code Playgroud)
由于const在应用于引用类型时不会更改任何内容,因此它将被忽略.
实际上,如果您在int& const没有模板的情况下编写,则会出现编译错误.但是在模板中允许它,因为在某些情况下很难避免这种类型.
另一种看待这种情况的方法是用指针替换引用.如果您这样做,您将获得以下类型:
const T* = T const* = int* const*
Run Code Online (Sandbox Code Playgroud)
此类型是指向可变(非常量)int的不可变(const)指针的指针.