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

я имею 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 );
}

2

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]