簡體   English   中英

何時使用具有靜態存儲持續時間的右值引用?

[英]When to use rvalue references with static storage duration?

C ++ 11允許在全局(,名稱空間,類)范圍內聲明右值引用,並具有靜態存儲持續時間。 使用這些變量的好方案是什么? 我做了幾次測試,並提出了一些觀察結果。 以下代碼將無法編譯(g ++ 5.3)

double&& m = 3.5;
double&& s() {return m;}

testy.cpp:在函數'double && s()'中:

testy.cpp:7:22:錯誤:無法將'double'左值綁定到'double &&'double && s(){return l;}

這是違反直覺的,甚至認為我們聲明了一個右值引用,它被視為數據按值返回。 當然,這是一個人為的例子,實際上返回一個右值參考是很少見的。 但是為什么它不起作用? 我的解釋是,通過使用靜態存儲持續時間聲明右值參考m ,我們得到了一種“通用參考”形式,這是由Scott Meyers創造的一個術語(更多信息在這里 )。 通用引用的一個屬性是它可以綁定到左值和右值。 然而,與依賴於由於類型替換引起的參考崩潰的“通用參考”不同,我所不清楚上述解決方案中涉及的機制。 事實上,以下代碼編譯沒有問題。

double&& m = 3.5;

int main() {
    double a {4.2};
    double& b = a;
    m = a;
    m = b;
    m = 3.2;
}

因此,如上所述, m雙重的每種風味結合。 但是,變量具有靜態存儲持續時間的事實似乎與綁定到臨時對象的rvalues的性質相矛盾。 很少有問題出現。 為什么允許這樣做? 什么情況會利用這個屬性? 我的第一個猜測是,我們可以使用它來提供模板特化,它接受任何參數的“味道”,就像通用引用一樣,除了它們與底層類型綁定得更強。 此外,“靜態右值參考”的范圍似乎無關緊要,即具有靜態存儲持續時間和“功能”范圍的右值也表現出如下所示的行為。

int main() {
    static double&& a = 4.2;
    double b = 3.2;
    double& c = b;
    a = b;
    a = c;
}

它無法編譯的原因是在錯誤消息中:

testy.cpp:7:22:錯誤:無法將'double' 左值綁定到'double &&'double && s(){return l;}

命名變量總是左值 - l是左值。 s()返回一個右值。 你必須使用強制轉換來完成這項工作:

double&& s() {return std::move(m); }

為什么允許這樣做? 什么情況會利用這個屬性?

是否真的值得在明確禁止它的語言中添加一個例外?

暫無
暫無

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

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