Re[3]: как std::vector<const std::string> передать как char*
От: Bell Россия  
Дата: 11.04.08 09:45
Оценка:
Здравствуйте, K13, Вы писали:

K13>
B>>std::vector<const char*> ptr_array(vec.size());
B>>std::transform(vec.begin(), vec.end(), ptr_array.begin(), std::mem_fun_ref(&std::string::c_str));
K13>


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)

Безусловно это надежней, но и затратней.
Любите книгу — источник знаний (с) М.Горький
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.