我有这段非常简单的代码;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::deque
到std::vector
它编译与Visual Studio 2010
error C2027: use of undefined type 'A'
然而,如果
我的问题是;这种行为是否由于某种原因而被预期?如果是这样,为什么编译器之间存在差异,或者这是g ++/icc还是MSVCC的错误?
+1,但是,我期待只有'deque'的UB。 – iammilind
“就标准而言,无论采用哪种实现方式都没有问题” - 符合标准的实现不应仅仅因为它具有未定义的行为而无法编译它。尽管它当然可以提供诊断功能,并将实现变为一种适用模式,其中这些诊断只是警告可能有点模糊。 –
@SteveJessop标准 (§1.3.12)中的_undefined behavior_的定义明确说明了“本国际标准对其所规定的 ** no **要求”(emphisis补充)。在紧接着的 笔记中,它给出了“终止**翻译**或执行(使用 发布诊断消息)”,作为 实现可能执行的操作的示例。 –