2014-02-20 46 views
1

在哪些方面可以从你喜欢的东西的boost ::算法使用的返回值::加入?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] 
在你上面这两种情况下

所以使用的char *表达式中的指针。 boost :: algorithm :: join和stringstream.str()直到表达式的末尾都可用,c_str指针也是如此。在链接

SBI评论你发送称为服用c_str()从临时串在一个表达其存储在const char *与顺便指出在第二语句C函数。

而且我通常会尝试调用C风格的函数,或需要为const char *外部库函数,只有当使用c_str。 在一个ostream < <的情况下,它已经接受的std :: string,它需要2秒的添加操作< <功能来支持新类型。