这是编译器错误吗?我做错什么了吗

Is this a compiler bug? Am I doing something wrong?

本文关键字:什么 编译器 错误      更新时间:2023-10-16

我试图制作一个简单的地图来查找一些数据,但结果非常奇怪:

#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构造函数中的一个错误。

相关文章: