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

ere*_*eOn 7 c++ const-cast undefined-behavior

如果我做:

const char* const_str = "Some string";

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

str[0] = "P"; // (2)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

可以写下这样的东西:

std::string str = "My string";

read_string(const_cast<char*>(str.c_str()));
Run Code Online (Sandbox Code Playgroud)

因为我知道肯定read_string()从未尝试写str

谢谢.

Rob*_*obH 9

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

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

  • "做,但抓住你的鼻子." 考虑在包装函数中执行一次,因此所有分布式调用站点至少可以避免这种丑陋. (6认同)
  • C++标准第5.2.11节#7表示*写操作*导致未定义的行为.因此,读操作应该是安全的. (2认同)