Для следующей программы:
#include <iostream>
#include <utility>
#include <vector>
#include <unordered_map>
#ifdef WITHPAIR
auto get_state() {
std::pair<std::vector<unsigned>, std::unordered_map<unsigned, unsigned&>> st;
auto& v = st.first;
auto& index = st.second;
v.assign({1u,2u,3u,4u});
index.insert({0u, v[0]});
index.insert({1u, v[1]});
index.insert({2u, v[2]});
index.insert({3u, v[3]});
return st;
}
#else
std::pair<std::vector<unsigned>, std::unordered_map<unsigned, unsigned&>> get_state() {
std::vector v{1u,2u,3u,4u};
std::unordered_map<unsigned, unsigned&> index{
{0u, v[0]},
{1u, v[1]},
{2u, v[2]},
{3u, v[3]}
};
return {v, index};
}
#endif
auto main() -> int {
auto [v, index] = get_state();
// auto [v, index] = std::move(get_state());
std::cout << v[0] << " " << index.at(0) << std::endl;
v[0] = 5;
std::cout << v[0] << " " << index.at(0) << std::endl;
std::cout << v[1] << " " << index.at(1) << std::endl;
v[2] = 17;
std::cout << v[2] << " " << index.at(2) << std::endl;
std::cout << v[3] << " " << index.at(3) << std::endl;
return 0;
}
http://coliru.stacked -crooked.com / a / f9e528074ae78c03
Компиляция без -DWITHPAIR
для просмотра поведения секундыfunction
Существует две версии функции get_state
.
Кажется, только первая функция имеет правильное поведение и фактически делает эти данные пригодными для использования при возврате из функции (каквы можете видеть из связанной программы);вторая функция ведет себя не так, и значения в unordered_map отличаются от значений в векторе.
У меня два вопроса:
- Правильно ли поведение первой функции?Это неопределенное поведение или нет?
- Почему второй меняет вектор?