c++ - 为什么通用参考不保持其论点的恒定性?
问题描述
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*
此类型是指向不可变(const)指针的指针,指向可变(非常量)int。
推荐阅读
- javascript - React-select creatable - only allow one created option
- java - Apache Beam - Exception caught and throwed even though program excuting continuosly. How to stop that process or handle in pipeline
- mysql - MySQL - 优化查询(LIMIT、OFFSET、JOIN)> 2500 万行
- paypal - 贝宝沙箱无法进行测试,我一次又一次地收到这个消息
- java - There is Not a managed type error when transfer entity to other package?
- pandas - Create Tuples of rows from pandas dataframe with additional incremental value in tuple
- linux - 将 stdout 和 stderr 重定向到一个文件,也重定向到 linux 中的控制台
- kotlin - 如何使用 mockk 模拟协程的执行?
- python - 按行对熊猫数据框进行排序
- javascript - 使用 --asar 提取电子包时 Chrome 驱动程序不起作用