Этот фрагмент кода компилируется с очень важным предупреждением.Bind const std :: pair <T, U> & to value of 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>&
.
Может ли задание ссылки выполняться таким образом, чтобы он работал вокруг смещения константных модификаторов?
вы должны написать '0.0f', чтобы вы не конвертировали' double' в 'float' (или изменить' 'float' '' '' '' '' '' '' '' '' '' '' ''. –
Почему бы просто не использовать 'auto'? –
@KerrekSB Функции, возвращающие ссылки, являются большим исключением из этого правила. – hvd