如何参考变体的价值?

时间:2018-12-20 17:54:46

标签: c++ visual-c++ std-variant

我有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 个答案:

答案 0 :(得分:5)

Lambda具有返回类型推导,但是它们通过值来推断返回类型。好像它们是一个返回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 );
}