这似乎是一个愚蠢的问题,但我确实需要澄清这一点:
这会给我的程序带来任何危险吗?
Is the const_cast
甚至需要?
如果我更改输入指针值,它将安全地工作std::string
或者它会产生未定义的行为?
到目前为止,唯一担心的是,每当我修改输入指针并使其无法使用时,这可能会影响字符串“some_text”。
std::string some_text = "Text with some input";
char * input = const_cast<char*>(some_text.c_str());
谢谢你给我一些提示,我想避免自己的脚被射中
作为邪恶行为的一个例子:与 gcc 的 Copy On Write 实现的交互。
#include <string>
#include <iostream>
int main() {
std::string const original = "Hello, World!";
std::string copy = original;
char* c = const_cast<char*>(copy.c_str());
c[0] = 'J';
std::cout << original << "\n";
}
行动中于ideone http://ideone.com/AezP2.
果冻,世界!
问题 ?顾名思义,gcc 的实现std::string
在幕后使用引用计数共享缓冲区。当一个字符串被修改时,实现会巧妙地检查当前缓冲区是否被共享,如果是,则在修改之前复制它,确保共享此缓冲区的其他字符串不会受到新写入的影响(因此名称,写时复制)。
现在,使用你的邪恶程序,你通过 const 方法访问共享缓冲区(承诺不修改任何内容),但你确实修改了它!
请注意,对于不使用写入时复制的 MSVC 实现,行为会有所不同("Hello, World!"
将被正确打印)。
这正是本质未定义的行为.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)