在下面的代码段中...是否可以安全地将对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());
您会遇到悬而未决的引用,因此我会谨慎使用此模式。

09-06 13:25