我已经做了很多关于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;
}我收到一条错误消息:
error: use of deleted function还有一条值得一读的好消息:
// **************************************************************************
// * 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). *
// **************************************************************************这是有道理的,但是我不想将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;
}但是得到了相同的错误。我用同样的错误尝试过的其他组合:
void func1()
{
auto const v1 =
get_vector() |
ranges::views::transform([](auto const& i) { return i + 1; }) |
ranges::views::cache1 |
ranges::to_vector;
}和:
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;
}我尝试使用操作,但遇到以下错误:
// * When piping a range into an action, the range must be moved in. *这对我来说没有多大意义,因为临时向量已经是一个右值。
我遗漏了什么?我现在就是个笨蛋。
发布于 2020-11-21 13:38:19
正如错误消息所说,当通过管道将范围传送到适配器时,您需要范围是l值或视图。
get_vector返回的临时向量不属于上述任何一类。一种解决方法是将其赋给一个l值,如下所示:
void func1()
{
auto&& vec = get_vector();
auto const v1 =
vec |
ranges::views::transform([](auto const& i) { return i + 1; }) |
ranges::to_vector;
}这是一个demo。
https://stackoverflow.com/questions/64938645
复制相似问题