【发布时间】:2023-04-01 04:05:01
【问题描述】:
我了解 const_cast 可用于指针和引用。
我假设const_cast 的输入应该是一个指针或引用。我想知道如果输入是指向const int 的指针/引用,为什么它不会删除常量?
以下代码按预期工作。
-
const_cast带多级指针int main() { using std::cout; #define endl '\n' const int * ip = new int(123); const int * ptr = ip; *const_cast<int*>(ptr) = 321; cout << "*ip: " << *ip << endl; // value of *ip is changed to 321 }但是当我尝试指向
const int或引用const int时,值似乎没有改变。 -
const_cast参考 const intint main() { using std::cout; #define endl '\n' const int i = 123; const int & ri = i; const_cast<int&>(ri) = 321; cout << "i: " << i << endl; // value in 'i' is 123 } -
const_cast带有指向 const int 的指针int main() { using std::cout; #define endl '\n' const int i = 123; const int * ri = &i; *const_cast<int*>(ri) = 321; cout << "i: " << i << endl; // value in 'i' is 123 }
(1) 按预期工作,但我无法理解为什么 (2) 和 (3) 不起作用我认为const_cast 的输入是指针/引用。
请帮助我理解这背后的理念。谢谢。
【问题讨论】:
-
所有 3 个示例都是未定义的行为,来自 CppCoreGuidelines:不要抛弃 const。它用 const 制造谎言。如果变量实际声明为 const,则“抛弃 const”的结果是未定义的行为。
-
尝试更改 const 对象 (
const int) 的值是未定义的行为,这就是 2 和 3 不起作用的原因。 1没有任何const int,只有一个int和const int*指向它,所以没关系。 -
@Kaldrr 示例 1 定义明确。
-
您对
"\n"字面量有异议吗?你的 sn-ps 中的这个endl宏让我感觉很不舒服 :) -
@lubgr:算了,我没在里面看到
#define endl '\n'——那很很奇怪……
标签: c++ const-cast