C++ 两次相同的for循环:一个编译,另一个不编译

C++ 两次相同的for循环:一个编译,另一个不编译,c++,string,c++11,dictionary,C++,String,C++11,Dictionary,我有一段代码让两个字符串小写 基于的第一个范围似乎已编译,而最后一个范围未编译:Clang给我错误:无法使用const限定类型“const char&”分配给变量“c” 考虑到它们完全相同,为什么第一个会通过而第二个不会通过?请注意,的值类型是std::pair,这意味着对于p来说,首先会得到一个const std::string,然后c的类型将是const char&,不能修改 第一个代码段没有这样的问题;解算器是一个非常量std::string。请注意,的值类型是std::pair,这意味着

我有一段代码让两个字符串小写

基于的第一个范围似乎已编译,而最后一个范围未编译:Clang给我错误:无法使用const限定类型“const char&”分配给变量“c”

考虑到它们完全相同,为什么第一个会通过而第二个不会通过?

请注意,的值类型是std::pair,这意味着对于p来说,首先会得到一个const std::string,然后c的类型将是const char&,不能修改

第一个代码段没有这样的问题;解算器是一个非常量std::string。

请注意,的值类型是std::pair,这意味着对于p来说,首先您将得到一个常量std::string,然后c的类型将是常量char&,无法修改


第一个代码段没有这样的问题;解算器是一个非常量std::string。

OT:如果它要编译,它仍然是无用的,因为您修改了原始映射的副本。OT:如果它要编译,它仍然是无用的,因为您修改了原始映射的副本。
void some_free_standing_function(std::string solver, std::map<std::string, option_t> opts) {

    for (auto & c : solver) c = tolower(c);
    for (auto p : opts)
        for (auto & c : p.first)
            c = tolower(c);
}