2011-10-24 29 views
5

我有这段非常简单的代码;MSVCC/g ++/icc中std deque/vector之间的不同行为

#include <deque> 
#include <vector> 

using namespace std; 

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

int main(void) 
{ 
} 

如果我编译这段代码既g ++以及ICC/ICPC在Linux上编译罚款,即使-Wall它没有给出警告。如果我将双侧齿轮换成矢量,情况也是一样的。

我想建立使用MSVCC(CL)窗口这个代码,但不幸的是它会抛出错误c2027:我改变std::dequestd::vector它编译与Visual Studio 2010

精细

error C2027: use of undefined type 'A' 

然而,如果

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

回答

12

这是不确定的行为(包括具有std::dequestd::vector, 所以不管实现是否与它是好的,只要 标准而言。你实例化一个标准容器 一个不完整的类型。

当相克编译++,-Wall(在一般情况下,所有的选项开始 与-W)唯一担心的语言。对于库的问题,您应该 与-D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC以及编译。(如果这导致性能 的问题,您可以删除最后的t wo -D in优化版本。)

+0

+1,但是,我期待只有'deque'的UB。 – iammilind

+0

“就标准而言,无论采用哪种实现方式都没有问题” - 符合标准的实现不应仅仅因为它具有未定义的行为而无法编译它。尽管它当然可以提供诊断功能,并将实现变为一种适用模式,其中这些诊断只是警告可能有点模糊。 –

+0

@SteveJessop标准 (§1.3.12)中的_undefined behavior_的定义明确说明了“本国际标准对其所规定的 ** no **要求”(emphisis补充)。在紧接着的 笔记中,它给出了“终止**翻译**或执行(使用 发布诊断消息)”,作为 实现可能执行的操作的示例。 –

0

除了James Kanze的回答,我搜索了四周,发现了this Dr Dobbs article,它解释了使用不完整类型容器的标准立场。

此外它暗示它与vector s协同工作的原因,而不是deque,即实现。一个典型的载体可以是这样的

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

这是正常与不完全类型,因为我们只有一个指向Tdeque很可能以这样的方式来实现(在VS2010),它利用了T的价值从而使其与不完整类型不兼容。

相关问题