Аннотация
Является ли отсутствие у std::string
неконстантной .data()
функции-члена надзором или намеренным дизайном, основанным на семантике до C ++ 11 std::string
?В любом случае это отсутствие функциональности побуждает разработчиков использовать небезопасные альтернативы в нескольких законных сценариях.В этой статье говорится о добавлении неконстантной .data()
функции-члена для std :: string, чтобы улучшить единообразие в стандартной библиотеке и помочь разработчикам на C ++ написать правильный код.
Use Cases * 1025В библиотеки *
C иногда включаются подпрограммы с параметрами char *.Одним из примеров является параметр lpCommandLine
функции CreateProcess
в Windows API.Поскольку data()
член std::string
является константой, его нельзя использовать для того, чтобы заставить объекты std :: string работать с параметром lpCommandLine
.Разработчики испытывают желание использовать .front()
вместо этого, как в следующем примере.
std::string programName;
// ...
if( CreateProcess( NULL, &programName.front(), /* etc. */ ) ) {
// etc.
} else {
// handle error
}
Обратите внимание, что когда programName
пусто, выражение programName.front()
вызывает неопределенное поведение.Временная пустая C-строка исправляет ошибку.
std::string programName;
// ...
if( !programName.empty() ) {
char emptyString[] = {'\0'};
if( CreateProcess( NULL, programName.empty() ? emptyString : &programName.front(), /* etc. */ ) ) {
// etc.
} else {
// handle error
}
}
Если бы был неконстантный .data()
член, как в случае с std::vector
, правильный код был бы простым.
std::string programName;
// ...
if( !programName.empty() ) {
char emptyString[] = {'\0'};
if( CreateProcess( NULL, programName.data(), /* etc. */ ) ) {
// etc.
} else {
// handle error
}
}
Неконстантная функция-член .data() std::string
также удобна при вызове функции библиотеки C, которая не имеет квалификации const для своих параметров строки C.Это часто встречается в старых кодах и в тех, которые должны быть переносимы со старыми компиляторами C.