【问题标题】:Why std::queue creation with std::vector container does not raise compiler error为什么使用 std::vector 容器创建 std::queue 不会引发编译器错误
【发布时间】:2015-08-15 13:51:30
【问题描述】:

为什么使用std::vector 容器创建std::queue 不会引发编译器错误?

仅在调用 pop 时发生编译器错误(这很清楚,因为 vector 不提供 pop_front())。

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

int main()
{
    queue<int, vector<int>> s;

    s.push(10);

    cout << s.front() << endl;

    s.pop();

    return 0;
}

DEMO

【问题讨论】:

  • 什么是“非默认 std::vector”?
  • @KerrekSB: 意味着 std::vector 不是队列的默认容器(即 std::deque)。无论如何编辑了标题。是的,更清晰。
  • 好吧,创作工作。 pop 不起作用,因此您会在此处收到错误。
  • 好电话。这似乎是一个实施质量问题。绝对可取。是否严格必要是我无法回答的问题,尽管在我看来,标准表明它可能是。

标签: c++ stl queue stdvector


【解决方案1】:

因为类模板的成员函数在被调用之前不会被隐式实例化。

从 $14.7.1/2 隐式实例化 [temp.inst]:

除非类模板的成员或成员模板已被 显式实例化或显式特化,特化 当特化时,成员的隐式实例化 在需要成员定义存在的上下文中引用;

和/4:

[ Example:
template<class T> struct Z {
void f();
void g();
};
void h() {
Z<int> a; // instantiation of class Z<int> required
Z<char>* p; // instantiation of class Z<char> not required
Z<double>* q; // instantiation of class Z<double> not required
a.f(); // instantiation of Z<int>::f() required
p->g(); // instantiation of class Z<char> required, and
// instantiation of Z<char>::g() required
}

和/11:

实现不应隐式实例化函数 模板、变量模板、成员模板、非虚拟成员 函数、成员类或类模板的静态数据成员 不需要实例化。

【讨论】:

  • 我认为这不能解释为什么不需要诊断,如果我正确阅读了 §23.6.3.1/1,这似乎意味着诊断实际上是要求:“任何支持操作的序列容器……都可以用来实例化queue”——这是否意味着没有其他容器可以用来实例化queue
  • @KonradRudolph 是的,容器必须满足这些要求,因此不能使用其他 标准 容器(不过,您可以自己制作)。这是 Concepts 将在 C++17 中(最终)做的事情之一。
  • @KonradRudolph 如果你不调用pop(),它将不会被实例化,所以没有人试图在vector 上调用一个不存在的pop_front()。所以这取决于你对它的使用。
  • @songyuanyao 我认为这与这里无关。 class 必须在实例化类时检查是否满足要求(例如通过static_assert),而不是编译器(由于您引用的段落,这是不允许的)。我认为这个答案是错误的。至少,该类绝对允许在实例化时诊断此问题,而您的回答暗示情况并非如此。
  • @KonradRudolph:如果它不是未定义的,那么它是什么?您引用的句子没有说“序列容器......”。它没有添加,“而其他的不能”。它只是指定可以使用支持这些操作的序列容器。所以它肯定不是格式错误的。它只能是未指定或未定义的。而且,标准库的实现只需要与规范一致即可;它被(明确地)允许额外实现其他功能(或在标准不需要这样做的情况下产生可预测的结果)。
猜你喜欢
  • 2017-04-27
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 2015-01-04
  • 2022-12-07
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
相关资源
最近更新 更多