[英]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.