在C++中用列表初始化构造类对象时,如何理解它?

wpx232ag  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(118)

众所周知,列表初始化是从C11引入到C中的,在大多数情况下都很容易理解,但是在使用列表初始化构造类对象时,总是让我感到困惑。
我不明白列表初始化在下面的代码中是如何工作的,以及它是如何生成Status对象的,从push document中,我们可以知道它的参数类型是const Status& value还是Status&& value,所以在q.push({node->val, node})中,{node-〉瓦尔,node}将被强制转换为Status,我不知道这是如何完成的。
有谁能帮忙吗?任何帮助都很感激。

// 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;
    }
};
lyr7nygr

lyr7nygr1#

答案已经被开发者在评论中指出了,为了让对这个问题感到困惑的人更容易理解答案,我在这里重述一下评论中的答案。
将实参传递给函数参数的过程是参数的初始化,而不是赋值。Status是一个聚合类型(根据aggregate initialization),所以在语句q.push({node->val, node})中有一个聚合初始化,它使用{node-〉瓦尔,node}来初始化聚合类型Status。

相关问题