Как получить ссылку на значение варианта?

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

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

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

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

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

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

#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 ответ

Решение

Лямбды имеют вычет типа возврата, но они выводят тип возврата по значению. Это как если бы они возвращали функцию 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 );
}
Другие вопросы по тегам