具有指针作为键的映射的值类型 对于我所知道的,C++定义了 MAP:ValueSyType < /C> >作为代码>配对< /Calp> < /P>

具有指针作为键的映射的值类型 对于我所知道的,C++定义了 MAP:ValueSyType < /C> >作为代码>配对< /Calp> < /P>,c++,stl,map,C++,Stl,Map,如果在映射中使用指针类型作为键类型,即 std::map<const char*,int>::value_type::first_type = const char* std::map::value\u type::first\u type=const char* 正如我从上面的定义中所期望的,或者 std::map<const char*,int>::value_type::first_type = const char* const std::map::valu

如果在映射中使用指针类型作为键类型,即

std::map<const char*,int>::value_type::first_type = const char*
std::map::value\u type::first\u type=const char*
正如我从上面的定义中所期望的,或者

std::map<const char*,int>::value_type::first_type = const char* const
std::map::value\u type::first\u type=const char*const

更符合逻辑的是(否则我将被允许从映射迭代器更改键值)

如果
a
const char*
,那么
const a
确实是
const char*const

您的评估是正确的,但出于两个原因,您必须非常小心使用这种方法:

  • 您必须提供一个自定义比较器谓词,该谓词对const char*进行正确排序(例如,使用一个strcmp变量,该变量仅在key1 <> LI>你必须考虑地图中键的寿命以及当地图被销毁时它们如何被释放。

  • 您的推理是正确的,
    value\u type::first
    将是
    char const*const

    T
    类型*
    时,认为
    const T
    const类型*
    是一种常见的困惑,但事实并非如此。与宏不同,
    typedef
    s不是文本替换,也不是模板参数。执行
    const T
    时,如果
    T
    typedef
    或模板参数,则将
    const
    作为一个整体添加到类型中


    这就是我喜欢在类型的右边写我的
    const
    s的原因之一,因为它会减少混淆:
    T const*
    ,添加一个额外的const,获取
    T const*const

    考虑改用std::string。是的,通常这是一个常见错误,然而,在某些情况下,您确实只想比较指针而不是字符串(例如:如果您有编译时常量字符串作为键,如枚举的可打印版本,或者如果您正在从HWND映射到winapi事件管理中的相对窗口处理对象),这会减轻您的负担。我想我们应该推广使用
    type const
    而不是
    const type
    的惯例,特别是在新程序员中,这将避免在
    type
    是指针的情况下产生混淆。