Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将迭代器解引用到临时范围时出现非指针操作数错误_C++_C++11_Lazy Evaluation_Range V3 - Fatal编程技术网

C++ 将迭代器解引用到临时范围时出现非指针操作数错误

C++ 将迭代器解引用到临时范围时出现非指针操作数错误,c++,c++11,lazy-evaluation,range-v3,C++,C++11,Lazy Evaluation,Range V3,使用 我们可以这样做: auto empty_line = [](auto& str){ return str.size() == 0; }; 我们也可以这样做: auto line_range_with_first_non_empty = ranges::view::drop_while(ranges::getlines(std::cin),empty_line); auto input1 = std::stoi(*line_range_with_f

使用

我们可以这样做:

auto empty_line = [](auto& str){ return str.size() == 0; };
我们也可以这样做:

auto line_range_with_first_non_empty = 
                ranges::view::drop_while(ranges::getlines(std::cin),empty_line);
auto input1 = std::stoi(*line_range_with_first_non_empty.begin());
不幸的是,当我试图将上述版本缩短为:

auto line_range2 = ranges::getlines(std::cin);
auto iter2 = ranges::find_if_not(line_range2,empty_line);
auto input2 = std::stoi(*iter2);
我得到一个错误:

auto iter3 = ranges::find_if_not(ranges::getlines(std::cin),empty_line);
// auto input3 = std::stoi(*iter3);
这会产生相同的错误

auto sin = std::istringstream{"\n\n\nmy line\n"};
auto iter4 = ranges::find_if_not(ranges::getlines(sin),empty_line);
// Error when deref.
// auto input4 = std::stoi(*iter4);
:27:29:错误:间接寻址需要指针操作数('ranges::v3::dangling'无效)
自动输入4=标准::stoi(*iter4);
^~~~~~
如果
将范围作为右值,为什么当
范围::find_时不能取消引用

ranges::getlines
是否返回范围?如果是的话,靶场应该拥有东西吗


如果传递给算法的范围是临时的,并且算法返回一个迭代器,迭代器将被包装在一个悬挂的
包装器中,以防止您执行任何不安全的操作。任务完成。:-)

在一个简单的实现中,第三个示例将
find\u if\u不
将迭代器返回到一个临时范围。该范围将被销毁,使迭代器悬空,然后才能使用,从而导致未定义的行为。ranges提案,将其转化为编译时错误。@IgorTandetnik我认为ranges永远不会拥有任何东西。这意味着范围可以拥有东西,对吗?视图的迭代器被允许持有指向其视图的指针,所以它们可以悬挂。有些视图保存数据。例如,
getlines
视图将在内部
std::string
中缓存最近读取的行,member说。大师本人。:-)目前,
std::stoi(*ranges::find_if_not(ranges::getlines(sin),empty_line))
也被阻止,正如我所见,需要使用
get_unsafe()
。您是否考虑添加<代码>悬停::运算符i()const & & <代码>?如果是这样的话,您可能会拒绝这种方法,因为它可以通过
std::move
(?)进行“利用”。这让我很不舒服。我需要坐下来想一想原因,除了我脑子里的小精灵在尖叫“太微妙了!太可爱了!”
auto sin = std::istringstream{"\n\n\nmy line\n"};
auto iter4 = ranges::find_if_not(ranges::getlines(sin),empty_line);
// Error when deref.
// auto input4 = std::stoi(*iter4);
<source>:27:29: error: indirection requires pointer operand ('ranges::v3::dangling<ranges::v3::_basic_iterator_::basic_iterator<ranges::v3::getlines_range::cursor> >' invalid)
    auto input4 = std::stoi(*iter4);
                        ^~~~~~