собственно вот пример програмки, в реальном жизни функция f находится в сторонней библиотеке и править её нет никакой возможности. Как сделать чтобы заработало?
Re[2]: как std::vector<const std::string> передать как char*
ИМХО рискованно. Нет никакой гарантии на время жизни указателя, возвращаемого c_str(), за пределами текущего оператора.
Надежнее копировать через сами строки во временный буфер выставляя указатели (если не конечно этот кусок не bottleneck)
Re[2]: как std::vector<const std::string> передать как char*
K13>ИМХО рискованно. Нет никакой гарантии на время жизни указателя, возвращаемого c_str(), за пределами текущего оператора.
Если бы это было так, то практическая ценность c_str равнялась бы нулю:
21.3.6 basic_string string operations
const charT* c_str() const;
1 Returns: A pointer to the initial element of an array of length size() + 1 whose first size() elements
equal the corresponding elements of the string controlled by *this and whose last element is a
null character specified by charT(). 2 Requires: The program shall not alter any of the values stored in the array. Nor shall the program treat the
returned value as a valid pointer value after any subsequent call to a non-const member function of the
class basic_string that designates the same object as this.
Так что до тех пор, пока объект не трогают (не вызывают неконстантные методы), указатель, возвращенный c_str, валиден.
Опасность тут в другом — приходится снимать константность с указетелей.
K13>Надежнее копировать через сами строки во временный буфер выставляя указатели (если не конечно этот кусок не bottleneck)
Безусловно это надежней, но и затратней.
Любите книгу — источник знаний (с) М.Горький
Re[3]: как std::vector<const std::string> передать как char*
А тебе действительно нужен доступ к константым данным как к неконстантым, или ты просто забыл написать модификатор const в параметре функции f?
Исходя из задачи, решаемой в примере, его лучше бы переписать как-то так:
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, szag, Вы писали:
R>А тебе действительно нужен доступ к константым данным как к неконстантым, или ты просто забыл написать модификатор const в параметре функции f? R>Исходя из задачи, решаемой в примере, его лучше бы переписать как-то так: R>
Здравствуйте, szag, Вы писали:
S>Нет, функцию f править нельзя. Я просто написал пример, на самом деле список строк формируется на этапе выполнения и заранее он не известен.
Понятно. В таком случае, надо отдавать себе отчет, что такая огрганизация чревата: изначально имеем константные данные, реинтерпретируем их как неконстантные, оправдывая этим, что так надо для конкретной функции, что сама по себе эта функция проверенная и никакого вреда не причинит... Но проходит время, таких опасных мест становится все больше, к проекту подключаются новые люди, и потом бац! в один прекрасный момент выясняется, что наш проект уже как пол года неработоспособен, в чем корень зла никто не знает, и в ночь с пятницы на понедельник мы в муках ищем заплату на эту дырку, потому, что в понедельник кровь из носу должен быть релиз.
... << RSDN@Home 1.2.0 alpha rev. 787>>
--
Справедливость выше закона. А человечность выше справедливости.
Re[4]: как std::vector<const std::string> передать как char*
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, szag, Вы писали:
S>>Нет, функцию f править нельзя. Я просто написал пример, на самом деле список строк формируется на этапе выполнения и заранее он не известен.
R>Понятно. В таком случае, надо отдавать себе отчет, что такая огрганизация чревата: изначально имеем константные данные, реинтерпретируем их как неконстантные, оправдывая этим, что так надо для конкретной функции, что сама по себе эта функция проверенная и никакого вреда не причинит... Но проходит время, таких опасных мест становится все больше, к проекту подключаются новые люди, и потом бац! в один прекрасный момент выясняется, что наш проект уже как пол года неработоспособен, в чем корень зла никто не знает, и в ночь с пятницы на понедельник мы в муках ищем заплату на эту дырку, потому, что в понедельник кровь из носу должен быть релиз.
Вы абсолютно правы. Но у меня просто нет выбора. Эта функция (f) копирует эти строки себе внутри себя и больше никак передаваемый массив не использует. Почему сделали на вход char** а не const char** я не знаю.