Хорошо, итак: мы все знаем, что использование 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 например) — все они имеют оговорку, что да, эти методы не гарантируют работу ни по одному стандарту C++, но на практике все они работают.
Имея это в виду, мне просто любопытно, как использование const_cast<char*>(string.c_str())
сравнивается с другими известными методами (например, вышеупомянутыми &string[0]
и т. д.)… Я спрашиваю, потому что код, в котором я нашел этот метод, работает на практике, и я подумал Я бы посмотрел, что думают эксперты, прежде чем пытаться переписать неизбежную const_cast<>()
-свободную версию.
std::vector<char>
вместоstd::string
. У вас есть доступный для записи буфер без всего кастинга. - person PaulMcKenzie   schedule 07.12.2015char temporary[] = "/tmp/directory-XXXXX"; char* dtemp = mkdtemp(temporary);
Так как это создает массив в стеке, который инициализируется копией строкового литерала, у вас есть все права изменять эту копию, включая передачу ее вmkdtemp()
. Правда, здесь не используется блестящий материал C++, но он короче, проще и правильнее, чем тот вариант, с которым вы столкнулись :-) - person cmaster - reinstate monica   schedule 08.12.2015mkdtemp()
использования. - person fish2000   schedule 08.12.2015