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