Рассмотрим этот код
#include <iterator>
#include <vector>
const int& foo(const std::vector<int>& x,unsigned i) {
auto it = x.begin();
std::advance(it,i);
return *it;
}
Оба clang и gcc не выдают ошибок/предупреждений, но это:
#include <iterator>
#include <map>
const std::pair<int,int>& bar(const std::map<int,int>& x,unsigned i){
auto it = x.begin();
std::advance(it,i);
return *it;
}
скомпилировано с помощью clang и с использованием -Werror
приводит к:
<source>:14:12: error: returning reference to local temporary object [-Werror,-Wreturn-stack-address]
return *it;
^~~
и с gcc:
<source>: In function 'const std::pair<int, int>& bar(const std::map<int, int>&, unsigned int)':
<source>:14:13: error: returning reference to temporary [-Werror=return-local-addr]
return *it;
^~
Почему gcc и clang отклоняют bar
и почему foo
подходит?
std::pair<int,int>
должен быть создан и возвращен? 24.03.2018