Следует ли применять руководство по выводу для std :: option при передаче std :: ref (value)? - PullRequest
0 голосов
/ 07 мая 2018

Фон

Я хотел бы запускать некоторые функции последовательно, замыкая короткое замыкание, когда одна из них завершается успешно. Все они имеют одинаковый тип возвращаемого значения, в большинстве случаев они могут вызываться с нулевым аргументом (лямбда-выражения с перехватами). Чтобы определить успешность, функция возвращает непустую опцию Дело в том, что иногда эти функции возвращают ссылки, и в этом случае пишется

return std::optional{some_reference};

будет UB. Но, похоже, что делает

return std::optional{std::ref(some_reference)} ;

нет. GCC 9 счастливо компилирует это. Хотя лязг 7 не .


Полный код:

#include <optional>
#include <functional>
#include <iostream>

int main()
{
    int x = 12;
    auto job = [](const int& y)
    {
        return std::optional{std::ref(y)};
    };
    auto value = job(x);
    x = 25;
    std::cout << *value << '\n';
}

Вопрос

Какой из них прав?


Я полагаю, что код должен скомпилироваться, потому что следует применить вывод аргумента шаблона класса и std::reference_wrapper<int> вывести.

1 Ответ

0 голосов
/ 07 мая 2018

Код в OP правильно сформирован и должен давать optional<reference_wrapper<int>>.

Это ошибка llvm 34650 .Более простой пример, демонстрирующий проблему:

std::optional o(42);

gcc позволяет (с o, равным std::optional<int>), clang - нет.

...