如果字符串是const,可以const_cast c_str()吗?

Can I const_cast c_str() if the string is const?

本文关键字:const str cast 字符串 可以 如果      更新时间:2023-10-16

我发现了很多堆栈溢出的例子,但这些例子都是基于非const std::string。如果字符串是const(顶级和非顶级)怎么办?

std::string encrypt(std::string const &input)
{
  //do something, ArrayGuard is a smart pointer to guard the raw char* delete by free
  ArrayGuard<char> guard(encrypt_str(const_cast<char*>(input.c_str())));
  return std::string(guard.get(), std::strlen(guard.get()));    
}

case 1(非顶层?):

std::string input = "abcde";
std::string encrypt_password = encrypt(input);

case 2(顶级?):

std::string const input = "abcde";
std::string encrypt_password = encrypt(input);

确定 encrypt_str 不会改变我传递给它的char*(如果可能的话,我想要求他们修复这个非const校正api)。

ps:我不确定我完全理解什么是顶级const/&/&&/volatile,这就是为什么我在

后面加上"?"

关于const_cast,您必须注意的规则是,如果您使用它来修改最初声明为const的对象,那么您将获得未定义的行为。

只要你确定这不会发生,你就很好。

std::string的稳定性没有任何影响。即使std::string不是const, c_str函数仍然返回const char*。当你把std::string改成const时,没有什么变化。