MSVCC / g ++ / icc中std deque / vector之间的不同行为

时间:2011-10-24 09:05:00

标签: c++ visual-studio-2010 g++ std

我有一段非常简单的代码;

#include <deque>
#include <vector>

using namespace std;

class A
{
public:
    A(){};
    ~A(){};
    deque<A> my_array; // vector<A> my_array;
};

int main(void)
{
}

如果我在linux上使用g ++和icc / icpc编译此代码,它编译得很好,即使使用-Wall它也没有警告。如果我将双端队列交换为向量,情况就是一样。

我想在Windows上使用MSVCC(cl)构建此代码但不幸的是它抛出了错误c2027:

error C2027: use of undefined type 'A'

但是,如果我将std::deque更改为std::vector,则可以使用Visual Studio 2010进行编译。

我的问题是;这种行为是出于某种原因预期的吗?如果是这样,为什么编译器之间存在差异,或者这是g ++ / icc还是MSVCC的错误?

2 个答案:

答案 0 :(得分:12)

这是未定义的行为(包括std::dequestd::vector, 因此无论实现如何处理它都没关系 标准是关注的。您正在使用实例化标准容器 不完整的类型。

使用g ++进行编译时,-Wall(通常,所有选项都会启动 与-W)仅关注语言。对于图书馆问题,你应该是 同时使用-D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC进行编译。 (如果这导致表现 问题,您可以删除优化版本中的最后两个-D。)

答案 1 :(得分:0)

继詹姆斯坎泽的回答之后,我搜索了一下this Dr Dobbs article,这解释了标准在使用不完整类型的容器时的立场。

此外,它暗示了它适用于vector但不适用deque的原因,即实施。典型的矢量可能类似于

class vector<T> {
    T* buff;
    int size;
    // ... snip
};

这对于不完整类型是可以的,因为我们只有一个指向T的指针,但是deque很可能以这种方式实现(在VS2010中)它使用了T因此,它与不完整的类型不兼容。