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

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

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

// 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
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Laravel - это мощный PHP-фреймворк, используемый для создания масштабируемых и надежных веб-приложений. Одним из преимуществ Laravel является его...
Что такое двойные вопросительные знаки (??) в JavaScript?
Что такое двойные вопросительные знаки (??) в JavaScript?
Как безопасно обрабатывать неопределенные и нулевые значения в коде с помощью Nullish Coalescing
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как сделать компонент справочного центра с помощью TailwindCSS
Как сделать компонент справочного центра с помощью TailwindCSS
Справочный центр - это веб-сайт, где клиенты могут найти ответы на свои вопросы и решения своих проблем. Созданный для решения многих распространенных...
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
1
5
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

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

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