对于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)?
如果有效 - 在priority_queue中使用的第一个模板参数(即someClass
)是什么。
答案 0 :(得分:5)
在C ++ 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;
[取自this reference]
该声明显示了使用第一个模板参数的方式,时间和位置。
答案 1 :(得分:5)
容器适配器的第一个模板参数
T
应表示 与Container::value_type
相同的类型。
相应地写std::priority_queue<SomeClass, std::vector<int>>
会导致未定义的行为。