2013-05-12 42 views
2

对于以下片断,为什么const_cast不会修改调用函数中的值?

#include <iostream> 
using namespace std; 

void fun(const int *p) 
{ 
    int *q = const_cast<int *>(p); 
    *q = *q * 10; 
    cout<<"q: "<<q<<"\t Value: "<<*q<<endl; 
} 

int main() 
{ 
    const int a = 10; 
    const int *z = &a; 
    fun(z); 
    cout<<"z: "<<z<<"\t"<<"Address of a: "<<&a<<endl; 
    cout<<"value at z: "<<*z<<"\t\t value in a: "<<a<<endl; 
} 

产生的输出是

q: 0x7fff65910fcc Value: 100 
z: 0x7fff65910fcc Address of a: 0x7fff65910fcc 
value at z: 100  value in a: 10 

为什么即使我试图修改它在乐趣的值不被修改()?

a和指针z的地址是如何相同,但值是不同的?

它是一种未定义的行为与const_cast?

+0

请注意,编译器可能要使用你给他关于常量性的信息来进行一些优化。(这是拍摄约常量性照顾的第二个原因,第一个是“不错的代码“告诉程序员它不会触及你的数据) – leemes 2013-05-12 09:45:27

回答

9

这是一种未定义的行为与const_cast?

是的,您的程序包含未定义的行为。

这意味着你不能对它的输出有任何期望。其原因是由C++ 11标准第7.1.6.1/4给出:

除了任何类成员声明mutable(7.1.1)可以被修改,任何尝试期间修改const 对象其寿命(3.8)导致未定义的行为

段落上const_cast 5.2.11/7包含一个进一步警告:

[:取决于不g,通过指针,左值或指针 写入数据成员从const_cast丢弃const-限定符可能会产生未定义的 行为(7.1.6.1)。 - 注完]

+1

基本上你可以使用'const_cast'来抛弃'const'而不是仅仅是'const'的东西。编译器可以自由地将'const'对象存储在ROM中,或者进行优化,假设它们永远不会改变(比如改变print语句来打印一个常量编译时间值,或者其他任何感觉) – Yakk 2013-05-12 09:51:34

相关问题