代码之家  ›  专栏  ›  技术社区  ›  Soonts

如何获取对变量值的引用?

  •  2
  • Soonts  · 技术社区  · 6 年前

    std::variant 所有类都从同一个基派生。我想把变型投射到基地。

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

    这将编译但发出警告C4172:返回局部变量或临时变量的地址

    有办法参观吗 到位,无需制作本地或临时副本?

    或者,如果这是不可能的,我如何才能将价值投射到 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 回复  |  直到 6 年前
        1
  •  5
  •   Justin    6 年前

    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 );
    }