3

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

1 に答える 1