这是编译器错误吗?我做错什么了吗
Is this a compiler bug? Am I doing something wrong?
我试图制作一个简单的地图来查找一些数据,但结果非常奇怪:
#include "stdafx.h"
#include "atlstr.h"
#include <map>
enum InputTypes { Manual, Automatic, Assisted, Imported, Offline };
struct Params
{
int inputType;
const char* moduleName;
DWORD flag;
};
int _tmain()
{
std::map<CString, Params> options {
{ "Add", { Manual, "RecordLib", 0 } },
{ "Open", { Assisted, "ViewLib", 1 } },
{ "Close", { Imported, "EditLib", 2 } },
{ "Inventory", { Automatic, "ControlLib", 3 } },
{ "Report", { Offline, "ReportLib", 4 } }
};
for (std::map<CString, Params>::iterator iter = options.begin(); iter != options.end(); ++iter)
{
printf("Entry: %s ==> { %d, %s, %d }n", (const char*)(iter->first),
iter->second.inputType, iter->second.moduleName, iter->second.flag);
}
return 0;
}
输出:
Entry: îþîþîþîþîþîþîþîþîþîþîþîþ[â0; t ==> { 0, RecordLib, 0 }
Entry: Close ==> { 3, EditLib, 2 }
Entry: Inventory ==> { 1, ControlLib, 3 }
Entry: îþîþîþîþîþîþîþîþîþîþîþîþCâ0# t ==> { 2, ViewLib, 1 }
Entry: Report ==> { 4, ReportLib, 4 }
正如您所看到的,有几个CString值变成了垃圾。但我看不出有什么理由不能用这种方式创建地图。
这是Microsoft Visual Studio 2013编译器中的错误吗
我的代码有什么地方不见了吗?
##############编辑##########
对于那些认为这是CString
的问题的人,我用std::string
重写了它,得到了更差的输出:
#include "stdafx.h"
#include "atlstr.h"
#include <map>
enum InputTypes { Manual, Automatic, Assisted, Imported, Offline };
struct Params
{
int inputType;
std::string moduleName;
DWORD flag;
};
int _tmain(int argc, _TCHAR* argv[])
{
std::map<std::string, Params> options{
{ "Add", { Manual, "RecordLib", 0 } },
{ "Open", { Assisted, "ViewLib", 1 } },
{ "Close", { Imported, "EditLib", 2 } },
{ "Inventory", { Automatic, "ControlLib", 3 } },
{ "Report", { Offline, "ReportLib", 4 } }
};
for (std::map<std::string, Params>::iterator iter = options.begin(); iter != options.end(); ++iter)
{
printf("Entry: %s ==> { %d, %s, %d }n", iter->first.c_str(),
iter->second.inputType, iter->second.moduleName.c_str(), iter->second.flag);
}
return 0;
}
输出
Entry: ==> { 0, , 0 }
Entry: Report ==> { 4, , 4 }
请注意,这在IDEOne 上确实有效
我已经将您的示例复制到MSVC中。它甚至不仅仅是不正确的打印——它是在销毁映射时ATL CString中的内存冲突。但所有这些都适用于std::string。结论-ATL实现有缺陷。如果我胡乱猜测,我会说,这是move构造函数中的一个错误。
相关文章:
- 编译器对数组声明大小的计算。什么时候发生?
- 这个失败的测试是将零添加到空指针未定义的行为、编译器错误还是其他什么?
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 在使用包含冒号的类似函数的宏时,是什么导致了这种编译器差异?
- 我的设备上的 C++ 编译器版本是什么
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 让编译器告诉什么确切的纯虚拟方法使结构抽象?
- 这个编译器错误究竟希望我执行什么?
- Visual Studio 编译器的 record-gcc-switch 相当于什么?
- 如果字符串在 C/C++ 中没有 NUL 字符(以防编译器允许它通过)会发生什么情况?
- 编译器在这里做什么,允许在很少进行实际比较的情况下比较许多值
- 告诉编译器我希望变量始终存储在寄存器中的正确方法是什么
- openmpi 编译器有什么区别
- 使用不同的编译器 - 这有什么作用
- 编译器遇到返回语句时会做什么
- 这是(auto && elem : v)语法简单C++吗?我应该使用什么编译器来编译它?
- visual studio 2012为C++使用了什么编译器?它兼容吗?我可以将它与代码块一起使用吗
- 什么's编译器's析构函数省略的自由
- 下载什么编译器,如何下载编译器,以及如何将编译器添加到Qt?(ubuntu 12.04)
- 在什么情况下,为Qt MinGW或MSVC选择什么编译器