Невозможно получить адрес элемента в списке по варианту
Я пытался зациклить список и получить адрес элемента. Но все адреса элементов одинаковы при использовании варианта класса.
int main()
{
std::list<std::variant<std::list<int>, std::list<std::string>>> list_of_lists;
std::list<int> int_list = {1, 2, 3};
std::list<std::string> string_list = {"one", "two", "three"};
cout<<"int list at: "<<&int_list<<endl;
cout<<"string list at: "<<&string_list<<endl;
list_of_lists.push_back(int_list);
list_of_lists.push_back(string_list);
// Iterate over all std::variant elements.
for (const auto& v : list_of_lists) {
// Check if the variant holds a list of ints.
if (std::holds_alternative<std::list<int>>(v)) {
cout<<"int list inside the loop at: "<<& v<<endl;
cout<<"int list inside the loop at: "<<& std::get<std::list<int>>(v)<<endl;
// 'v' holds a list of ints.
for (auto i : std::get<std::list<int>>(v)) {
std::cout << i << ' ';
}
std::cout << '\n';
}
// Check if the variant holds a list of strings.
else if (std::holds_alternative<std::list<std::string>>(v)) {
// 'v' holds a list of strings.
cout<<"string list inside the loop at: "<<& v<<endl;
cout<<"string list inside the loop at: "<<& std::get<std::list<string>>(v)<<endl;
for (const auto& s : std::get<std::list<std::string>>(v)) {
std::cout << s << ' ';
}
std::cout << '\n';
}
}
}
int list at: 0x8dfce0
string list at: 0x8dfcc0
int list inside the loop at: 0x8f2790
int list inside the loop at: 0x8f2790
1 2 3
string list inside the loop at: 0x8f2890
string list inside the loop at: 0x8f2890
one two three
Смотри, они изменились. Они не одинаковы после его использования
1 ответ
Для int
Цикл, вы создали локальную переменную и взять ее адрес.
for (auto i : std::get<std::list<int>>(v)) // local variable, same address each time
должно быть
for (auto& i : std::get<std::list<int>>(v)) // reference, refers to the actual element
Это не имеет ничего общего с вариантами.
Для string
цикл, вы уже используете ссылку.
for (const auto& s : std::get<std::list<std::string>>(v)) // reference
Вот почему все работает так, как ожидалось.