簡體   English   中英

哪種標准措辭告訴我們ref-to-const臨時終身擴展只“工作一次”?

[英]Which standard wording tells us that ref-to-const temporary lifetime extension only “works once”?

我在聊天中看到了以下示例:

#include <iostream>
struct foo { ~foo() { std::cout << "destroying!\n"; } };
const foo& func(const foo& a, const foo&) { return a; }

int main()
{
  foo x;
  const foo& y = func(foo(), x);
  std::cout << "main\n";
}

輸出

destroying!
main
destroying!

它似乎證明了foo臨時的生命周期並沒有擴展到整個main ,即使它綁定到該范圍內的ref-to- const

據推測,那么,終身延伸只能“有效”; 也就是說,它在func的參數初始化時應用,但不通過連續綁定傳遞。

我的解釋是否正確? 如果是這樣(並且如果任何單個段落直接適用),那么定義此行為的標准措辭是什么?

你幾乎是對的。 這種行為實際上來自函數調用,而不是因為任何類型的“僅一次工作”規則。

這是整個終身擴展“功能”的措辭,相關規則以粗體強調:

[C++11: 12.2/5]: [..]引用綁定的臨時對象或綁定引用的子對象的完整對象的臨時對象在引用的生命周期內持續存在, 除了

  • [..]
  • 函數調用(5.2.2)中的引用參數的臨時綁定將持續到包含該調用的完整表達式完成為止。
  • [..]

這是兩份問題報告的主題, http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1299http://www.open-std.org/jtc1/sc22/ wg21 / docs / cwg_active.html#1568

以前的問題報告,我是其中的記者,旨在涵蓋所有這些情況,其中引用綁定到臨時對象,但不打算延長壽命。 問題正文中的描述僅提到prvalues與臨時表達式混淆(實際上決定了他們評估的生命周期是否延長)。 但是lvalue和xvalues同樣在標准中與這些混淆。 static_cast的上下文中發生的一個例子是問題號#1568(其中使用“臨時變量”進一步混淆了這個問題)。

實際上,這個:

函數調用(5.2.2)中的引用參數的臨時綁定將持續到包含該調用的完整表達式完成為止。

與同一段中的其他規則相矛盾。 因為臨時被綁定到在一個函數調用和到本地自動參考變量的引用參數。

這里適用的規則是常識。 該標准措辭不佳,事實上確實證明了這一點。 但是沒有實際的方法來實現它。

可能我有點慢,但對我來說,通過閱讀其他答案,這個問題的解決方案並不清楚。 因此,我修改了所顯示的代碼,並希望總結其他代碼:答案是,如果訪問y ,則會得到未定義的行為

運行此代碼:

struct foo {
    int id;
    foo(int id) : id(id) { std::cout << "ctor " << id << std::endl; };
    ~foo() { std::cout << "dtor " << id << std::endl; }
};
const foo& func(const foo& a, const foo&) { return a; }

int main(int argc, char** argv) {
    foo x(1);
    const foo& y = func(foo(2), x);
    std::cout << "main " << y.id << std::endl;
    return 0;
}

我的輸出是:

ctor 1
ctor 2
dtor 2
main 2
dtor 1

main 2未定義的行為

暫無
暫無

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

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