从(指向const的指针)到(指向非const的指针)的转换是无效的c ++吗?

时间:2011-12-20 02:34:58

标签: c++ pointers casting g++ const

我确信以下代码不应该编译。但是,在g ++中,它确实可以编译!请参阅http://codepad.org/MR7Dsvlz编译。

代码:

#include <iostream>

using namespace std;

int main() {
    int x = 32 ;
    // note: if x is, instead, a const int, the code still compiles, 
    // but the output is "32".

    const int * ptr1 = & x ;

    *((int *)ptr1) = 64 ; // questionable cast
    cout << x ;           // result: "64"
}

编译时g ++是错误的吗?

3 个答案:

答案 0 :(得分:9)

没有。根据C ++标准的§5.4.4,可以由C风格演员表演的演员表是:

— a const_cast (5.2.11),
— a static_cast (5.2.9),
— a static_cast followed by a const_cast,
— a reinterpret_cast (5.2.10), or
— a reinterpret_cast followed by a const_cast

这被广泛称为“抛弃const - ness”,如果编译器没有编译该代码,编译器将不符合标准的那部分。

正如ildjarn指出的那样,通过抛弃const来修改const对象是未定义的行为。此程序没有显示未定义的行为,因为尽管指针指向的对象 - const,对象本身不是const(感谢R.Martinho和eharvest纠正我的不良阅读)。

答案 1 :(得分:3)

没有。编译代码时,g ++没有错误。你所做的演员是有效的。

(int *)ptr1是一个演员阵容。 c ++中的等价物是const_cast<int*>(ptr1)。第二种风格更清晰易读。

但是,需要执行此操作(修改const变量)显示设计中存在问题。

答案 2 :(得分:1)

*((int *)ptr1) = 64行等同于*(const_cast<int*>(ptr1)) = 64 const_cast是使用强制转换符号时执行的第一个强制转换。