std::vector(或其他地方)中最奇怪的bug(或其他东西)。什么';发生什么事了? 我尝试用VisualStudio 2012 RC和英特尔C++编译器XE 12.1编译这个。如果你能尝试使用其他编译器,我将不胜感激。请在代码中查看我的注释,以真正理解这个bug的奇怪之处。有人知道发生了什么吗?我应该在哪里提交一份关于这个问题的bug报告 // File: NamedSameA.h #pragma once //文件:NamedSameB.cpp #包括 #包括“NamedSameA.h” #包括“NamedSameB.h” 结构名称名称 { int data1;//注释掉这一行以使程序工作 std::矢量数据2; }; 无效测试() { 名称名称名称名称; namedname.data2.assign(100,42); //前一行生成以下运行时错误: // ------------------------------------------------------- //调试断言失败! //程序:C:\Windows\system32\MSVCP110D.dll //文件:c:\ProgramFiles(x86)\microsoft visual studio 11.0\vc\include\vector //电话:240 //表达式:向量迭代器不兼容 }

std::vector(或其他地方)中最奇怪的bug(或其他东西)。什么';发生什么事了? 我尝试用VisualStudio 2012 RC和英特尔C++编译器XE 12.1编译这个。如果你能尝试使用其他编译器,我将不胜感激。请在代码中查看我的注释,以真正理解这个bug的奇怪之处。有人知道发生了什么吗?我应该在哪里提交一份关于这个问题的bug报告 // File: NamedSameA.h #pragma once //文件:NamedSameB.cpp #包括 #包括“NamedSameA.h” #包括“NamedSameB.h” 结构名称名称 { int data1;//注释掉这一行以使程序工作 std::矢量数据2; }; 无效测试() { 名称名称名称名称; namedname.data2.assign(100,42); //前一行生成以下运行时错误: // ------------------------------------------------------- //调试断言失败! //程序:C:\Windows\system32\MSVCP110D.dll //文件:c:\ProgramFiles(x86)\microsoft visual studio 11.0\vc\include\vector //电话:240 //表达式:向量迭代器不兼容 },c++,vector,bug-tracking,stdvector,C++,Vector,Bug Tracking,Stdvector,通过给两个不同的类/结构赋予相同的名称,您违反了。这会导致未定义的行为,因此任何结果都是可能的,包括崩溃 多年来,我发现,我越确信自己发现了一个编译器错误,我的程序就越有可能存在根本性缺陷。给两个不同的类/结构赋予相同的名称,就违反了规则。这会导致未定义的行为,因此任何结果都是可能的,包括崩溃 多年来,我发现,我越确信自己发现了编译器错误,我的程序就越有可能存在根本性缺陷。Erm,使用迭代器,而不是整数。@R.MartinhoFernandes-有一个版本具有size\u t和t,在这种情况下,

通过给两个不同的类/结构赋予相同的名称,您违反了。这会导致未定义的行为,因此任何结果都是可能的,包括崩溃


多年来,我发现,我越确信自己发现了一个编译器错误,我的程序就越有可能存在根本性缺陷。

给两个不同的类/结构赋予相同的名称,就违反了规则。这会导致未定义的行为,因此任何结果都是可能的,包括崩溃


多年来,我发现,我越确信自己发现了编译器错误,我的程序就越有可能存在根本性缺陷。

Erm,使用迭代器,而不是整数。@R.MartinhoFernandes-有一个版本具有
size\u t
t
,在这种情况下,
T
int
。这违反了一条定义规则吗?@KirilKirov哦,我错过了。谢谢。呃,需要迭代器,而不是整数。@R.MartinhoFernandes-有一个版本有
size\u t
t
,在这种情况下,
t
int
。这违反了一个定义规则吗?@KirilKirov哦,我错过了。谢谢。但是那些命名结构在不同的cpp文件中。它们位于不同的翻译单元中,并且具有内在联系。因此,它们不属于单一定义规则。它们应该是不同的东西。另外,违反一个定义规则是否应该导致编译时错误,以及一些奇怪的随机运行时断言,这些断言只发生在调试模式下?@zeroes00,我在您的代码示例中没有看到任何会导致内部链接的内容。编译器不需要检测ODR冲突,通常也不需要,因为问题跨越翻译单元。奇怪的随机运行时断言实际上对于未定义的行为是一个很好的结果,很可能更糟。好吧,我的困惑源于一种误解,即术语链接也适用于类。所以我认为源(cpp,c,…)文件中定义的类在某种程度上是该翻译单元的内部,因此与其他翻译单元完全分离。有时我讨厌C++但是那些命名的结构在不同的cpp文件中。它们位于不同的翻译单元中,并且具有内在联系。因此,它们不属于单一定义规则。它们应该是不同的东西。另外,违反一个定义规则是否应该导致编译时错误,以及一些奇怪的随机运行时断言,这些断言只发生在调试模式下?@zeroes00,我在您的代码示例中没有看到任何会导致内部链接的内容。编译器不需要检测ODR冲突,通常也不需要,因为问题跨越翻译单元。奇怪的随机运行时断言实际上对于未定义的行为是一个很好的结果,很可能更糟。好吧,我的困惑源于一种误解,即术语链接也适用于类。所以我认为源(cpp,c,…)文件中定义的类在某种程度上是该翻译单元的内部,因此与其他翻译单元完全分离。有时我讨厌C++
// File: NamedSameA.cpp

#include <vector>

#include "NamedSameA.h"

struct NamedSame // Rename this class to something else to make the program work
{
    std::vector<int> data;
    // Comment out the previous line or change
    // the data type to int to make the program work
};

static NamedSame g_data; // Comment out this line to make the program work
// File: NamedSameB.h

#pragma once

void test();
// File: NamedSameB.cpp

#include <vector>

#include "NamedSameA.h"
#include "NamedSameB.h"

struct NamedSame
{
    int              data1; // Comment out this line to make the program work
    std::vector<int> data2;
};

void test()
{
    NamedSame namedSame;
    namedSame.data2.assign(100, 42);
    // The previous line produces the following runtime error:
    // -------------------------------------------------------
    // Debug Assertion Failed!
    // Program: C:\Windows\system32\MSVCP110D.dll
    // File: c:\program files (x86)\microsoft visual studio 11.0\vc\include\vector
    // Line: 240
    // Expression: vector iterators incompatible
}