使用const char*literal作为std :: map键是否安全?

Mar*_*rry 7 c++ key stdmap string-literals c++11

我有课,每个都返回它的名字

struct IFoo {
    virtual const char * GetName() const = 0;
}

struct Foo : IFoo {
   const char * GetName() const { return "Foo"; }
}

struct Bar: IFoo {
   const char * GetName() const { return "Bar"; }
}
Run Code Online (Sandbox Code Playgroud)

而在其他地方:

Foo* a = new Foo();
Foo* b = new Foo();

std::map<const char *, int> data;
data[a->GetName()] = 0;
printf("%i", data[b->GetName()]);
Run Code Online (Sandbox Code Playgroud)

字符串文字应存储在内存中的一个位置,但它是100%吗?这段代码适用于gcc,但我不确定它的多平台性.

eer*_*ika 5

使用const char *文字作为std::map键是否安全?

是.

但是,请考虑这不能保证找到您的对象(但可能,取决于实现):

data["Foo"]
Run Code Online (Sandbox Code Playgroud)

这保证找不到你的对象:

char[] str = "Foo";
data[str];
Run Code Online (Sandbox Code Playgroud)

使用基于的自定义地图比较器std::strcmp将允许上述两种情况都起作用.

然后剩下的唯一陷阱是将指向本地缓冲区的指针存储到地图中的可能性将超过本地缓冲区.如果你当然只存储字符串文字,那就不会发生这种情况,但是在使用地图时你必须记住这一点.一把std::string钥匙不会有这样的警告.