2014-02-20 1 views
1

Каким образом вы можете использовать возвращаемые значения из таких вещей, как boost :: algorithm :: join?Какова область возвращаемых значений из boost :: algorithm :: join?

std::stringstream ss; 
ss<<"quack"; 
std::cout << ss.str().c_str() << std::endl; // bad idea 

Это плохая идея, объяснил в комментарии SbI в https://stackoverflow.com/a/1430774/

std::vector<std::string> v; 
v.push_back("foo"); 
v.push_back("bar"); 
std::cout << boost::algorithm::join(v,"-").c_str() << std::endl; // what about this? 

Это заставило меня задаться вопросом, если это та же проблема?

Может ли кто-нибудь дать объяснение объема таких возвращаемых значений?

ответ

3

Поскольку вы не хранить ссылку на гольца * нет никаких проблем с обоими выражениями:

От стандартной .. http://isocpp.org/std/the-standard

Temporary objects are destroyed as the last step in evaluating the 
full-expression (1.9) that (lexically) contains the point where they 
were created. [12.2/3] 

Таким образом, в обоих случаях выше вас использовать символ * указатель в выражении. Усиление :: algorithm :: join и stringstream.str() доступны до конца выражения, а также указатель c_str.

Комментарий sbi в указанной вами ссылке относится к принятию c_str() из временной строки в одном выражении, хранящем ее в const char * и передающей ее функции C во втором выражении.

Также я обычно пытаюсь использовать c_str только при вызове функций стиля C или внешних библиотечных функций, для которых требуется const char *. В случае ostream < < он уже принимает std :: string и требуется 2 секунды, чтобы добавить оператора < < функции поддержки новых типов.

Смежные вопросы