考虑以下示例。 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;
}
编辑添加该函数按值返回变量。
答案 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
。
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。
另一方面,当你使用命名变量而不是临时变量时,一切正常。