循环范围在地图的元素上

时间:2017-01-28 08:15:35

标签: c++ c++11

考虑以下示例。 config_parser是类的对象,其方法variable_map()按值返回类型std::map<std::string, std::vector<std::string>>的对象。第一个循环给出错误或垃圾结果,而第二个循环给出正确的结果。我错过了什么?

编译器使用:GCC 6.3.1,clang 3.9.1,(c ++ 14)

 std::vector<std::string> rules = config_parser.variable_map()["CellQRule"];

 for (const auto rule : config_parser.variable_map()["CellQRule"]) {
   std::cout << rule << std::endl;
 }
 for (const auto rule : rules) {
   std::cout << rule << std::endl;
 }

以下代码也为这两个循环提供了正确的结果。

 auto map = config_parser.variable_map();
 auto q_rules = map["CellQRule"];

 for (const auto rule : map["CellQRule"]) {
    std::cout << rule << std::endl;
 }
 for (const auto rule : q_rules) {
   std::cout << rule << std::endl;
 }

编辑添加该函数按值返回变量。

1 个答案:

答案 0 :(得分:2)

假设config_parser.variable_map()按值返回,那么对于config_parser.variable_map()["CellQRule"];config_parser.variable_map()将返回临时std::map,然后config_parser.variable_map()["CellQRule"];将返回对{{1}的引用属于临时std::vector

range-based for loop

等效
std::map

注意在完整表达后临时将被销毁;所以在{ auto && __range = range_expression ; auto __begin = begin_expr ; auto __end = end_expr ; for ( ; __begin != __end; ++__begin) { range_declaration = *__begin; loop_statement } } 之后,auto && __range = range_expression ;将成为一个悬垂的参考;那么,UB。

另一方面,当你使用命名变量而不是临时变量时,一切正常。