range-v3: странное поведение - PullRequest
1 голос
/ 23 марта 2019

Я пытаюсь поиграть с range-v3, и у меня возникла проблема: он не извлекает значения из вектора, как я бы хотел.

См. Код ниже:

  1. При работе выводит (0, 0) вместо того, что я бы подумал, т.е. (1, 0)

  2. Если я раскомментирую строку auto pairs = ..., результат изменяется, и вывод становится (33144464,0), хотя переменная pairs не используется (и утверждение не будет выполнено)

#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 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).

1 Ответ

0 голосов
/ 24 марта 2019

В 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
...