簡體   English   中英

另一個 C++ 臨時生命周期混亂

[英]Another c++ temporary lifetime confusion

在下面的代碼片段中...在ToXML::s_成員變量中存儲對Quote::toXML返回的臨時字符串的引用是否安全,至少只要它僅與<<運算符一起使用? 即是子表達式q.toXML的結果,直到下一個; ?

什么是這里的完整表達式 wrt 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]:

在兩種情況下,臨時對象在與完整表達式結束不同的點被銷毀。 [...]

第二個上下文是當引用綁定到臨時對象時。117 引用綁定到的臨時對象或作為引用綁定到的子對象的完整對象的臨時對象在引用的生命周期內持續存在,除了:
— 在函數調用 (5.2.2) 中綁定到引用參數的臨時對象一直存在,直到包含調用的完整表達式完成。

我們在那個要點。 臨時對象綁定到引用參數 ( s ) 並持續存在,直到包含調用的完整表達式完成。 也就是說,它一直持續到

std::cout << ToXML("quote", q.toXML()) << std::endl;
// --- here ---------------------------------------^

由於它在整個使用過程中持續,因此非常安全。 但是,一旦您執行以下操作:

ToXML x("quote", q.toXML());

你被一個懸空的引用困住了,所以我會謹慎地使用這個模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM