簡體   English   中英

為什么xvalues不綁定到非const lvalue引用?

[英]Why don't xvalues bind to non-const lvalue references?

以下內容無法編譯:

#include <iostream>
using namespace std;

int x = 5;
int && f () { return std::move(x); }
int g(int & y) { return y; }

int main() {
    g(f());
    return 0;
}

我很清楚為什么prvalues(未命名臨時對象)不綁定到非const lvalue引用-修改它們沒有意義,因為它們很快就會消失。 但是,為什么xvalues不綁定到非const lvalue引用?

如果函數返回int && ,則引用的對象不能是臨時的,否則我們將獲得懸掛的引用。 因此,根據我的理解,如果返回一個int && ,則該引用具有附加保證,可以安全地從中移出。

編輯:糾正措辭:“值”綁定到“引用”,反之亦然。

第二編輯:以下編譯-除了y現在是左值,我沒有看到概念上的區別。 但是它仍然引用x。 我了解根據語言規范,為什么應該編譯而上面的代碼不應該編譯。 但是,我不了解其背后的原因。 為什么單純的鋸齒會改變圖像?

#include <iostream>
using namespace std;

int x = 5;
int && f () { return std::move(x); }
int g(int & y) { return y; }

int main() {
    int && y = f(); // reference!
    g(y); // compiles

    // check that y indeed references x
    y = 7;
    std::cout << x << std::endl; // prints 7, of course
    return 0;
}

第三編輯:簡而言之,不允許出現什么想法

int && f() { ... }
int g (int & y) { ...}
g(f());

但允許

int && f() { ... }
int g (int & y) { ...}
int & k (int && y) { return y; }
g(k(f()));

因為那會弄得一團糟。

非整點const左值參考的是,他們對非暫時性的對象,它們的壽命已經被一些其他手段管理的別名。 引入右值引用(最重要的是std::move )是為了創建引用的新“類”,其綁定表明引用者最有可能“安全”地脫離。

如果這些引用對象也能夠綁定到簡單的T& ,那么您將有很多模棱兩可的轉換錯誤,而且沒人會知道該怎么做。 您可以將此類轉換的排名降低,但是我覺得這仍然非常令人困惑。

因此,您正在向后看。 問問自己,為什么xvalues不綁定到非const lvalue引用

暫無
暫無

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

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