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