在我的工作中使用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 https://en.cppreference.com/w/cpp/language/const_cast:
const_cast
使得可以形成对实际上引用 const 对象的非常量类型的引用或指针,或者对实际上引用易失性对象的非易失性类型的引用或指针。通过非常量访问路径修改常量对象并通过非易失性左值引用易失性对象会导致未定义的行为。
所以你所拥有的是未定义的行为。
同样有趣的是来自简历类型限定符 https://en.cppreference.com/w/cpp/language/cv.
常量对象- 类型为 const 限定的对象,或 const 对象的不可变子对象。此类对象无法修改:尝试直接这样做会导致编译时错误,而尝试间接这样做(例如,通过指向非常量类型的引用或指针修改 const 对象)会导致未定义的行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)