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

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

最佳答案

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

关于c++ - 如何获取对变量值的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53873799/

相关文章:

c++ - typedef 一个 vector 和固定大小的 boost::numeric::ublas::vector

c++ - 避免在类模板中重复访问枚举的模板参数

c++ - OpenMP 并行峰值

c++ - 合并 2 个 wav 文件后生成的波形的采样率

c++ - 错误 LNK1104 : cannot open file 'DFOR.lib' Visual Studio

c++ - 获取当前保存的 std::variant 的 typeid(如 boost::variant type())

c++ - 使用 std::enable_if 重载函数以避免模板替换错误

c++ - 如何使用 blitz_0.9

c++ - DLL线程安全

c++ - 在 C++ 中,我可以从 std::variant 中移出一些东西吗?