我已经阅读了大量有关 range-v3 视图、操作以及它们如何与临时集合交互的内容,但我仍然觉得我缺少一些简单的东西,这些东西可以帮助我完成我认为应该工作的事情。
鉴于以下情况:
std::vector<int> get_vector() { return {1, 2, 3}; }
void func1()
{
auto const v1 =
get_vector() |
ranges::view::transform([](auto const& i) { return i + 1; }) |
ranges::to_vector;
}
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息:
error: use of deleted function
Run Code Online (Sandbox Code Playgroud)
还有一条值得一读的好消息:
// **************************************************************************
// * When piping a range into an adaptor, the range must satisfy the *
// * "viewable_range" concept. A range is viewable when either or both *
// * of these things are true: *
// * - The range is an lvalue (not a temporary object), OR *
// * - The range is a view (not a container). *
// **************************************************************************
Run Code Online (Sandbox Code Playgroud)
这是有道理的,但我不想将返回的向量保存get_vector到命名变量中。我不需要它。我只想要一个由transform和创建的新向量to_vector。
我不喜欢将临时向量分配给左值,因为我觉得它使它们合法化,并且在我看来,在这行代码之后,我希望临时向量被破坏。我不想让数据闲逛。我不希望它有名字。我不希望下一个开发人员意外地认为他们可以使用它。
我认为最让我感动的是我觉得这应该可行。将临时变量传递给函数对于 C++ 来说是最基本的功能。我想因为我没有创建一个我想要保存的视图,所以 range-v3 可能是不适合这项工作的库。
我尝试了我读过的其他几种组合。例如ranges::views::cache1:
void func1()
{
auto const v1 =
get_vector() |
ranges::views::cache1 |
ranges::views::transform([](auto const& i) { return i + 1; }) |
ranges::to_vector;
}
Run Code Online (Sandbox Code Playgroud)
但得到同样的错误。我尝试过的其他组合也出现相同的错误:
void func1()
{
auto const v1 =
get_vector() |
ranges::views::transform([](auto const& i) { return i + 1; }) |
ranges::views::cache1 |
ranges::to_vector;
}
Run Code Online (Sandbox Code Playgroud)
和:
void func1()
{
auto const v1 =
get_vector() |
ranges::views::cache1 |
ranges::views::transform([](auto const& i) { return i + 1; }) |
ranges::views::cache1 |
ranges::to_vector;
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用操作,但收到以下错误:
// * When piping a range into an action, the range must be moved in. *
Run Code Online (Sandbox Code Playgroud)
这对我来说没有多大意义,因为临时向量已经是一个右值。
我缺少什么?我现在只是打地鼠而已。
正如错误消息所示,当将范围传输到适配器时,您需要该范围是左值或视图。
返回的临时向量get_vector不属于上述任一类别。一种解决方法是将其分配给左值,如下所示:
void func1()
{
auto&& vec = get_vector();
auto const v1 =
vec |
ranges::views::transform([](auto const& i) { return i + 1; }) |
ranges::to_vector;
}
Run Code Online (Sandbox Code Playgroud)
这是一个演示。