在下面的代码段中...是否可以安全地将对Quote::toXML
返回的临时字符串的引用存储在ToXML::s_
成员变量中,至少要与<<
运算符一起使用?即子表达式q.toXML
的结果是否有效直到下一个;
?
在这里的完整表达是什么q.toXML
的返回值。整个std::cout
还是对ToXML
构造函数的调用?
#include <iostream>
#include <string>
struct ToXML
{
ToXML(char const * const tag, std::string const & s) : tag_(tag), s_(s)
{
}
char const * tag_;
std::string const & s_;
};
std::ostream & operator << (std::ostream & os, ToXML const & v)
{
return os << "<" << v.tag_ << ">" << v.s_ << "</" << v.tag_ << ">";
}
struct Quote
{
std::string toXML() const
{
return "<Quote/>";
}
};
int main()
{
Quote q;
std::cout << ToXML("quote", q.toXML()) << std::endl;
return 0;
}
最佳答案
是的,这很安全。
从[class.temp]:
我们正处于要点。临时对象绑定(bind)到引用参数(s
),并一直持续到包含调用的完整表达式完成。也就是说,它一直持续到
std::cout << ToXML("quote", q.toXML()) << std::endl;
// --- here ---------------------------------------^
由于它在整个使用过程中都能持续使用,因此非常安全。但是,一旦您执行以下操作:ToXML x("quote", q.toXML());
您会遇到悬而未决的引用,因此我会谨慎使用此模式。