Как получить ссылку на значение варианта? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть std::variant, где все классы получены из одной базы.Я хочу привести вариант к базе.

return std::visit( []( const Base& b ) { return b; }, v );

Компилируется, но выдает предупреждение C4172: возврат адреса локальной переменной или временной

Есть ли способ посетить std::variant на месте, безделать локальные или временные копии?

Или, если это невозможно, как я могу привести значение к void*, чтобы я мог использовать static_cast?

Обновление: Iдумал, что пример должен быть очевидным, но это не так, вот полное повторение:

#include <variant>

struct Base {};
struct A : Base {};
struct B : Base {};

const Base& cast( const std::variant<A, B>& v )
{
    return std::visit( []( Base const& b ) { return b; }, v );
}

int main()
{
    std::variant<A, B> v{ A{} };
    const auto& b = cast( v );
}

1 Ответ

0 голосов
/ 20 декабря 2018

Лямбды имеют вычет типа возврата, но они выводят тип возврата по значению.Это как если бы они были функцией, возвращающей auto, а не decltype(auto).Если вы хотите вернуться по ссылке, вам нужно указать тип возврата.

Таким образом, [](const Base& b) { return b; } возвращает по значению, копируя b.Явно укажите тип возвращаемого значения, чтобы он возвращался по ссылке:

const Base& cast( const std::variant<A, B>& v )
{
    return std::visit( []( Base const& b ) -> Base const& { return b; }, v );
}
...