Подтвердить что ты не робот

Что такое использование первого параметра шаблона в priority_queue

Для std:: priority_queue я предположил, что первый параметр шаблона, указанный тип и второй, должен быть контейнером этого типа. Пример:

priority_queue<int, vector<int>> someQueue;

Однако следующий код компилируется и, кажется, работает нормально:

class SomeClass
{
};

int main()
{
    priority_queue <SomeClass, vector<int>> pq;
    int x = 9;
    pq.push(x);
    int t = pq.top();
    cout << t << endl;
    pq.pop();
    return 0;
}

Является ли вышеуказанный код недействительным (т.е. дает UB)?

Если он действителен - каков первый параметр шаблона (т.е. someClass), который используется в priority_queue.

4b9b3361

Ответ 1

Недавно проголосовали за рабочий документ в Джексонвилле, LWG issue 2566:

Первый параметр шаблона T контейнерных адаптеров должен обозначать тот же тип, что и Container::value_type.

Запись std::priority_queue<SomeClass, std::vector<int>> соответственно приводит к поведению undefined.

Ответ 2

В спецификации С++ 11 раздел о std::priority_queue равен §23.6.4. В нем первый аргумент шаблона - это просто тип по умолчанию, используемый для контейнера, и ничего больше.

Фактический тип значения берется из контейнера.

Класс объявляется как

template<
    class T,
    class Container = std::vector<T>,
    class Compare = std::less<typename Container::value_type>
> class priority_queue;

[Взято из эта ссылка]

Это объявление показывает, как, когда и где используется первый аргумент шаблона.