考慮下面的C++程序在C++ 11 make_pair(_Ty1 && _Val1,常量_Ty2&_Val2)重大更改
#include<map>
#include<iostream>
int main() {
int a = 5, b = 7;
auto pair = std::make_pair<int, int>(a,b);
return 0;
}
在gcc-4.7.2 fails與不同的錯誤使用VC11和也,但它似乎是相關的,VC11錯誤信息是更有意義的
You cannot bind an lvalue to an rvalue
我從這次失敗明白的是
- VC11和我增刊ose gcc-4.7.2只有一個實現std :: make_pair
make_pair(_Ty1&& _Val1, const _Ty2& _Val2)
,它只能接受右值引用。之前的VC++版本示例VC10有兩個版本,一個接受左值和另一個右值引用 - Rvalue引用不能用於初始化非const引用,即
int & a = b * 5
無效。 - 我本來可以使用
std::move
將lvalue
轉換爲rvalue
參考,並且調用會成功。 - 由於
std::make_pair
爲每個參數接受兩種不同的類型,在所有可能的情況下,模板參數分辨率可以解析參數的類型,並且不需要明確指定類型。
這種情況似乎微不足道和不兼容性可以很容易地通過刪除明確的類型,使定義爲
auto pair = std::make_pair(a,b);
- 現在可以解決,我的問題是,什麼是去除驅動因素庫中的左值實現?
- 是否有可能知道任何其他庫函數已被類似的方式改變?
- 如何處理這些情況時,我需要針對多個編譯器,如g ++,CC,aCC,XL C++編譯器尚未升級或編譯器不支持右值引用和移動語義。
那麼,它不是一個突破性的改變,因爲誰在地球上使用具有顯式模板實例的'std :: make_pair'?它*明確設計*從自動類型扣除中獲利。所以很少有人會寫'std :: make_pair'來支持'std :: make_pair',所以沒有太多的代碼可以被破壞。那麼,不錯,找到。 –
不幸的是,我遇到了指定顯式類型的代碼。 – Abhijit
我相信這是在[http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43785](http://gcc.gnu.org/bugzilla/show_bug.cgi? ID = 43785) – Nevin