我遇到过这种模式的多个实例(仅使用boost :: filesystem作为示例):
boost::filesystem::path path = ...;
someFunctionTakingCStrings(path.string().c_str());
,其中
const std::string path::string() const
{
std::string tmp = ...
return tmp;
}
虽然我从未遇到过这种模式的问题,但我想知道sting()
返回的字符串何时被销毁以及访问c_str()
的代码是否安全c_str() lifetime is bound to std::string lifetime。< / p>
答案 0 :(得分:3)
someFunctionTakingCStrings(path.string().c_str());
是安全的,因为标准保证匿名临时path.string()
的生命周期能够在函数调用中存活。因此c_str()
返回的指针是someFunctionTakingCStrings
的有效参数。
const std::string path::string() const
是安全的,因为从概念上讲,您将返回tmp
的值副本,但实际上编译器会优化值副本(名为的过程名为返回值优化< / em>的)。
像const std::string& path::string() const
这样的函数体具有与 相同的函数体(因为引用将悬挂),并且
const char* ub_server()
{
std::string s = "Hello";
return s.c_str();
}
也是未定义的,因为函数返回时s
超出了范围。
最后,请注意,在标准C ++中,将指向匿名临时的指针作为函数调用中的参数是不虽然令人讨厌,但Visual C ++允许它作为扩展。