c++ - 使用 const_cast 的自动类型推导不起作用
问题描述
在我的工作中,使用const_cast
在某些情况下是不可避免的。
现在我有const_cast
一些非常复杂的类型,实际上我不想在const_cast<Clutter>
表达式中写出所有这些类型的混乱,尤其是如果Clutter
很长的话。
我的第一个想法是编写const_cast<>(myType)
,但我的编译器无法推断myType
. 因此,我考虑帮助我的编译器,并采用以下方法进行编译。
#include <stdlib.h>
#include <iostream>
int main(int, char**) {
const int constVar = 6;
using T = typename std::remove_cv<decltype(constVar)>::type;
auto& var = const_cast<T&>(constVar);
var *= 2;
std::cout << &constVar << " " << &var << "\n"; // Same address!
std::cout << constVar << " " << var << "\n";
return EXIT_SUCCESS;
}
不幸的是,程序给了我输出6 12
而不是预期的6 6
,我真的不明白吗?
我的方法有什么问题?
解决方案
从以下文档const_cast
:
const_cast
可以形成指向实际引用 const 对象的非 const 类型的引用或指针,或者形成指向实际引用 volatile 对象的非易失类型的引用或指针。通过非 const 访问路径修改 const 对象并通过非易失性左值引用易失性对象会导致未定义的行为。
所以你所拥有的是未定义的行为。
同样令人感兴趣的是来自cv type qualifiers的注释。
const object - 类型为 const 限定的对象,或 const 对象的非可变子对象。这样的对象不能被修改:直接尝试这样做是编译时错误,并且尝试间接这样做(例如,通过引用或指向非 const 类型的指针修改 const 对象)会导致未定义的行为。
推荐阅读
- javascript - 从特定文档查询子集合
- c# - 如何使用 Entity Framework Core 和 Linq 测试查询?
- visual-studio-code - 如何在 vscode 上编译 dafny?
- javascript - 禁用以前的日期 Datepicker JS
- flutter - 使用 FLUTTER_MAP 时图像数据无效
- python - 仅显示 Seaborn ClusterMap 中的行树状图
- html - 登录不适用于登录表单控件
- php - Laravel 在迁移中将 String Boolean 值更改为 Int Boolean
- r - 将时间分类到垃圾箱
- python - 我在我的 URL 中使用转换器类型来捕获 Django 中的字符串参数。会影响SEO吗?