Как понять инициализацию списка в С++ при использовании его для создания объекта класса?

Как мы все знаем, инициализация списка появилась в C++ из C++11. В большинстве случаев это легко понять. Однако при использовании инициализации списка для создания объекта класса это всегда сбивает меня с толку.

Я не понимаю, как работает инициализация списка в следующем коде и как он генерирует объекты состояния. Из push-документа мы можем узнать, что его тип аргумента — const Status& value или Status&& value. поэтому в q.push({node->val, node}) {node->val, node} будет приведено к статусу. Я не знаю, как это завершено.

Кто-нибудь может помочь? Любая помощь приветствуется.

// This is a code snippet from the official LeetCode solution.
class Solution {
public:
    struct Status {
        int val;
        ListNode *ptr;
        bool operator < (const Status &rhs) const {
            return val > rhs.val;
        }
    };

    priority_queue <Status> q;

    ListNode* mergeKLists(vector<ListNode*>& lists) {
        for (auto node: lists) {
            if (node) q.push({node->val, node});
        }
        ListNode head, *tail = &head;
        while (!q.empty()) {
            auto f = q.top(); q.pop();
            tail->next = f.ptr; 
            tail = tail->next;
            if (f.ptr->next) q.push({f.ptr->next->val, f.ptr->next});
        }
        return head.next;
    }
};

Это ничем не отличается от Status s{f.ptr->next->val, f.ptr->next};. Поскольку у Status нет пользовательских конструкторов, это просто упорядочивает все поля.

HolyBlackCat 14.02.2023 08:04

@HolyBlackCat, поэтому ему нужно вызывать конструктор для создания объекта Status?

csbo 14.02.2023 08:06

Это агрегатная инициализация

user4581301 14.02.2023 08:07

Что ты имеешь в виду? Технически он не вызывает конструктор Status (это называется «агрегатной инициализацией» и не использует конструкторы), но я не понимаю, почему это имеет значение, поскольку ему придется вызывать конструкторы отдельных членов независимо.

HolyBlackCat 14.02.2023 08:08

@HolyBlackCat Спасибо, под вашим руководством я полностью понял вопрос. Еще раз спасибо.

csbo 14.02.2023 09:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ответ уже был указан разработчиками в комментариях. Чтобы людям, которые запутались в этом вопросе, было легче понять ответ. Я повторю ответ из комментариев здесь.

Процесс передачи фактических аргументов параметрам функции — это инициализация параметров, а не назначение. И статус является агрегатным типом (согласно агрегатной инициализации), поэтому в операторе q.push({node->val, node}) есть агрегатная инициализация, которая использует {node-> val, node} для инициализации агрегатного типа Status.

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