我在理解类型何时推导出std::ranges::dangling
何时使用命名局部变量与纯右值作为std::ranges::sort
算法的参数时遇到问题。例如,我有一个函数将 a 返回prvalue
到标准容器,例如 std::vector ,我直接将其用作 的参数,然后我期望在尝试取消引用迭代器时std::ranges::sort
收到编译错误,这就是我得到的:std::ranges::dangling
#include <vector>
#include <algorithm>
auto get_data(){
return std::vector<int>{1, 2, 99, 5, 9, 4};
}
auto get_sorted(){
return std::ranges::sort(get_data());
}
int main(){
auto it = get_sorted();
*(it-1); //Compiler Error because it is a std::ranges::dangling iterator
}
但是,如果我稍微更改get_sorted
上面的函数以首先捕获命名变量中的向量并使用它来返回 的结果std::ranges::sort
,那么我不会得到悬空迭代器,即使main
命名变量中分配的向量应该是函数get_sorted
返回后销毁:
auto get_sorted(){
auto vec = get_data();
return std::ranges::sort(vec);
}
int main(){
auto it = get_sorted();
*(it-1); //Okay result = 99
}
即使我更改get_sorted
为使用本地声明的基于命名变量的容器,我也会得到一种行为,编译器不会抱怨在其调用者(例如函数)中取消引用悬空迭代器main
。
//doesn't return a std::ranges::dangling
auto get_sorted(){
std::vector<int> vec{1, 2, 99, 5, 9, 4};
return std::ranges::sort(vec);
}
当我将纯右值向量传递给std::ranges::sort
算法时,我再次得到std::ranges::dangling
预期的
//returns a std::ranges::dangling
auto get_sorted(){
std::vector<int> vec{1, 2, 99, 5, 9, 4};
return std::ranges::sort(std::vector<int>{1, 2, 99, 5, 9, 4});
}
对于编译器没有收到错误的情况,当我std::ragnes::dangling
使用选项进行编译时,我确实观察到运行时错误,fSanitize=address
这可能是因为在函数内的命名变量中分配的向量get_sorted
一旦后一个函数就超出了范围回。
不过,我想了解为什么在函数中使用命名变量会更改get_sorted
函数的返回类型,并可能提供有关如何正确使用临时变量和纯右值容器以std::ranges::dangling
尽可能获取的指南。