我确信以下代码不应该编译。但是,在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 ++是错误的吗?
答案 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
是使用强制转换符号时执行的第一个强制转换。