【发布时间】:2016-03-11 16:02:13
【问题描述】:
好的,所以:我们都知道通常在任何地方使用const_cast<>() 非常糟糕,这实际上是一种编程战争罪。所以这是一个假设性问题,关于在特定情况下可能会有多糟糕。
也就是说:我遇到了一些类似这样的代码:
std::string temporary = "/tmp/directory-XXXXX";
const char* dtemp = ::mkdtemp(const_cast<char*>(temporary.c_str()));
/// `temporary` is unused hereafter
...现在,我遇到了很多关于如何获得对 std::string 实例的底层缓冲区的可写访问的描述(例如,qv https://stackoverflow.com/a/15863513/298171)——它们都有一个警告,是的,这些方法不是t 保证可以通过任何 C++ 标准工作,但实际上它们都可以。
考虑到这一点,我只是好奇使用const_cast<char*>(string.c_str()) 与其他已知方法(例如前面提到的&string[0],&c)的比较...我问是因为我发现使用此方法的代码似乎有效在实践中很好,我想在尝试不可避免的const_cast<>()-free 重写之前,我会先看看专家的想法。
【问题讨论】:
-
使用
std::vector<char>而不是std::string。您拥有没有所有转换的可写缓冲区。 -
不是我要问的——我可以想出很多没有问题的方法。我很好奇是什么造成了问题的本质。
-
顺便说一句:正确的实现是这样的:
char temporary[] = "/tmp/directory-XXXXX"; char* dtemp = mkdtemp(temporary);因为这会在堆栈上创建一个数组,该数组是用字符串文字的副本初始化的,所以您有权修改该副本,包括将其传递给mkdtemp()。没错,这里没有使用闪亮的 C++ 东西,但它比您遇到的版本更短、更简单、更正确:-) -
@cmaster 绝对是的——虽然这会更明智并且不那么迂回,但我发布的 sn-p 是对实际生产代码的严重过度简化,这自然是够混乱的使这样一个直截了当的编辑变得不直截了当。但是,您确实正确地将静态分配给可写的基于堆栈的临时对象作为
mkdtemp()使用的理想素材。
标签: c++ stdstring mutable c-strings const-cast