如何获得变体值的引用?

Soo*_*nts 2 c++ visual-c++ std-variant

std::variant所有类都来自同一个基地.我想将变体转换为基础.

return std::visit( []( const Base& b ) { return b; }, v );
Run Code Online (Sandbox Code Playgroud)

这编译但发出警告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 );
}
Run Code Online (Sandbox Code Playgroud)

Jus*_*tin 5

Lambdas具有返回类型推导,但它们按值推导出返回类型.就好像它们是一个返回的函数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 );
}
Run Code Online (Sandbox Code Playgroud)