使用字符串文字访问 std::map<std::string, int> 有什么缺点?

What are the downsides to accessing a std::map<std::string, int> using string literals?

我用 C++ 编写了一个包含 std::map<std::string, Resource> 的 ResourceManager class。然后我当前的代码使用字符串文字访问这些方法,例如:

// ResourceManager.h
class ResourceManager {
    private:
        std::map<std::string, Resource>

    public:
        void loadResource(std::string_view resourceName, std::string_view fileName); 
        const Resource& getResource(std::string_view resourceName) const;
}

// a.cpp
resourceManager.loadResource("background image", "background_image.png")

// b.cpp
resourceManager.getResource("background image")

这会成为问题吗?我应该用 constants.h 文件中定义的常量替换所有这些字符串文字吗?在这种情况下,我应该只使用 enum 作为地图的键吗?

与使用魔法常量的任何其他情况一样,它会导致代码脆弱,,代码很可能会被破坏。特别是,考虑一下如果 "background image" 资源被加载一次并从多个不同位置检索时会发生什么,可能跨越许多源文件。如果资源在 loadResource 调用中被重命名,但您忘记更改其中一个 getResource 调用,程序将出现错误。使用枚举或使用命名常量可以避免此问题。

将枚举作为键的另一个好处是它非常高效:在查找值的过程中制作的任何键副本都很便宜。这与您当前的代码形成对比,您可能正在复制 resourceName 以执行查找(尽管使用透明比较器可以避免这种情况)。