下面的代碼片段編譯時帶有一個非常重要的警告。綁定const std :: pair <T, U>&std :: pair的值<const T, U>
#include <map>
#include <vector>
template <typename iterator>
const std::pair<int, float> &foo(iterator it) {
return *it;
}
int main() {
std::vector<std::pair<int, float>> vector;
std::map<int, float> map;
vector.push_back(std::make_pair(0, 0.0));
map.insert(std::make_pair(0, 0.0));
const std::pair<int, float> &r1 = foo(vector.begin());
const std::pair<int, float> &r2 = foo(map.begin());
if (r1 != r2) {
return 1;
}
return 0;
}
有從std::pair<const int, float>
到std::pair<int, float>
期間foo(map.begin())
創建的懸空參考的隱式轉換。
ref2.cpp: In instantiation of ‘const std::pair<int, float>& foo(iterator) [with iterator = std::_Rb_tree_iterator<std::pair<const int, float> >]’:
ref2.cpp:16:52: required from here
ref2.cpp:7:11: warning: returning reference to temporary [-Wreturn-local-addr]
return *it;
^~
我們可以在這種情況下,調整的r2
類型std::pair<const int, float>
。儘管如此,在一般情況下,將兩個調用的結果分配給類型兼容引用foo()
會很有用。例如,對foo()
的調用可能會封裝在總是返回std::pair<int, float>&
的另一個函數中。
是否可以對參考分配進行操作,以解決const修飾符未對齊的問題?
你應該寫'0.0f',所以你不會轉換'雙'到一個'浮動'(或者將你的'浮動'換成'雙')。 –
爲什麼不使用'auto'? –
@KerrekSB函數返回引用是該規則的一個很大的例外。 – hvd