使用const_cast<&gt ;?时,未定义的行为在哪里?

时间:2011-04-04 07:54:10

标签: c++ undefined-behavior const-cast

如果我这样做:

const char* const_str = "Some string";

char* str = const_cast<char*>(const_str); // (1)

str[0] = "P"; // (2)

哪个(哪一行)确实是未定义的行为?

我一直在搜索这个问题,但没有找到任何明确而准确的答案(或者至少没有我能理解的答案)。

还相关:如果我使用提供此类功能的外部库:

// The documentation states that str will never be modified, just read.
void read_string(char* str);

可以写出类似的内容:

std::string str = "My string";

read_string(const_cast<char*>(str.c_str()));

因为我确信read_string() 永远不会尝试写入str

谢谢。

2 个答案:

答案 0 :(得分:9)

第(2)行有未定义的行为。编译器可以自由地将常量放在只读存储器中(在Windows中曾经是一个“数据段”),因此写入它可能会导致程序终止。或者它可能不会。

当调用定义不明确的库函数(非const参数,应该是const)时,必须抛弃const-ness,唉,并不罕见。做,但抓住你的鼻子。

答案 1 :(得分:-1)

您正在尝试修改编译器可能已放入进程的只读部分的常量字符串。这样更好:

char str[32];
strcpy(str, "Some string");
str[0] = "P";