以下のコードスニペットは非常に重要な警告でコンパイルされます。Bind 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;
}
ダングリング参照を作成foo(map.begin())
中std::pair<int, float>
からstd::pair<const int, float>
から暗黙の変換があります。
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;
^~
私たちは、この場合にはstd::pair<const int, float>
にr2
の種類を調整することができます。それにもかかわらず、一般的な場合、foo()
への2つの呼び出しの結果を型互換性のある参照に割り当てることは有用である。たとえば、foo()
の呼び出しは、常にstd::pair<int, float>&
を返す別の関数でラップされることがあります。
const修飾子のミスアライメントを回避するように動作するように参照割り当てを行うことはできますか?
'0.0f'と書いて、' double'を'float'(または' float'sを 'double'に変更します)。 –
'auto'を使わないのはなぜですか? –
@KerrekSB参照を返す関数は、その規則の大きな例外です。 – hvd