在MSVCC/g++/icc中,std队列/vector的行为不同



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

#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也没有警告。如果我将deque转换为vector,情况也是一样的。

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

error C2027: use of undefined type 'A'

然而,如果我将std::deque更改为std::vector,它可以在Visual Studio 2010中编译良好。

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

这是未定义的行为(std::dequestd::vector),所以无论实现用它做什么都是好的,只要标准问题。实例化一个标准容器不完整类型

当用g++编译时,-Wall(一般来说,所有选项都是从与-W)只关注语言。对于库问题,您应该这样做也可以用-D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC编译。(如果这会影响性能

在优化的构建中可以删除最后两个-D

在James Kanze的回答之后,我搜索了一下,发现了Dr Dobbs的这篇文章,其中解释了使用不完整类型容器的标准立场。

进一步暗示了它与vector s而不是deque s一起工作的原因,即实现。典型的向量可以是

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

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

最新更新