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

Dan*_*Dan 5 c++ g++ std visual-studio-2010

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

#include <deque>
#include <vector>

using namespace std;

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

int main(void)
{
}
Run Code Online (Sandbox Code Playgroud)

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

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

error C2027: use of undefined type 'A'
Run Code Online (Sandbox Code Playgroud)

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

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

Jam*_*nze 12

这是未定义的行为(无论是with std::deque还是with std::vector,因此无论实现如何处理它都很好,就标准而言.你正在实例化一个不完整类型的标准容器.

使用g ++进行编译时-Wall(通常,所有以逗号开头的选项-W)仅涉及语言.对于库问题,您也应该进行编译-D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC.(如果这会导致性能问题,则可以删除-D优化版本中的最后两个.)