Невозможно получить адрес элемента в списке по варианту

Я пытался зациклить список и получить адрес элемента. Но все адреса элементов одинаковы при использовании варианта класса.

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

Вот почему все работает так, как ожидалось.

Другие вопросы по тегам