【问题标题】:range-v3: strange Behaviorrange-v3:奇怪的行为
【发布时间】:2019-08-13 23:04:42
【问题描述】:

我正在尝试使用 range-v3,但遇到了一个问题:它没有像我想要的那样从向量中提取值。

请看下面的代码:

  1. 运行时,它输出的是 (0, 0),而不是我想的,即 (1, 0)

  2. 1234563
#include <iostream>
#include <vector>
#include <range/v3/all.hpp>

auto foo()
{
    auto values = std::vector<int> { 1, 0 };
    // auto pairs = std::vector< std::pair<int, int> > { { 1, 0 }, { 0, 1 }, { 0, 0 } };

    return ranges::view::for_each(values, [=](int nb)
    {
        std::cout << " nb=" << nb << std::endl;
        assert( (nb == 0) || (nb == 1) );
        return ranges::yield(nb);
    });
}


int main()
{
    ranges::for_each(foo(), [](auto v) {
        std::cout << v << "\n";
    });
}

此代码是使用 g++ (g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0) 和 clang++ (clang version 8.0.0 (tags/RELEASE_800/final)) 编​​译的,使用以下命令:

g++ foo.cpp -std=c++14 -Irange-v3/include -Wall -Wpedantic
clang++ foo.cpp -std=c++14 -Irange-v3/include -Wall -Wpedantic

我正在为 range-v3 使用新的克隆,我可以在 ubuntu 和 OSX(使用 AppleClang)上重现它。

【问题讨论】:

  • 我怀疑这是因为 values 在您尝试通过视图访问它时已不存在。

标签: c++ range-v3


【解决方案1】:

clang 中有一个名为-Wlifetime 的实验性功能,可以在godbolt 上使用。它给出了以下警告,指向来自foo 的返回。

[x86-64 clang (experimental -Wlifetime) #1] warning: returning a dangling Pointer [-Wlifetime]
[x86-64 clang (experimental -Wlifetime) #1] note: pointee 'values' left the scope here

【讨论】:

    猜你喜欢
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2015-07-20
    • 2010-10-03
    相关资源
    最近更新 更多