c++ std::get_if(std::variant)通过指针而不是value/&/const&来获取变量参数,有什么实际原因吗?

w8f9ii69  于 2023-03-14  发布在  其他
关注(0)|答案(3)|浏览(503)

我从来没有使用过std::get_if,而且由于它的名称与std::get不同,我看不出它的参数为什么应该是指针¹(而std::get有一个引用参数)。
¹如果它也被命名为std::get,那么重载解决方案将是一个足够的理由。
是的,我的 * 问题 * 可以被复制成 * 问题 * Is it absolutely necessary for std::any_cast() and std::get_if(std::variant) to take pointer as an argument?,但关键是没有 * 答案 *,只有一个评论;唯一的答案集中在std::any_cast上。

nlejzf6q

nlejzf6q1#

这是因为get_ifnoexcept,所以永远不会抛出异常,为了实现这一点,它必须返回一个pointer,以便在访问失败时返回nullptr
因为它返回了指针,所以它必须接受variant的指针。如果它接受variant的引用,那么它必须能够接受variant&const variant&variant&&const variant&&的类型,但是指针保持ref限定没有意义。
考虑到get_if接受variant&&,你所做的就是返回一个xvalue的地址,这是很糟糕的,即使get_if只允许variant&const variant&,后者仍然可以接受一个variant&&,并返回一个悬空的。

xxhby3vn

xxhby3vn2#

据我所知,它是基于动态强制转换逻辑的。可能失败的动态强制转换接受一个指针并返回一个指针。
类似地,get可以失败,它接受一个指针并返回一个。
但实际上,它看起来像一个小自行车舍的决定没有多大的重要性。

qnyhuwrf

qnyhuwrf3#

这种设计允许您应用“链式”调用,如下所示:

struct A : public std::variant<int, float>{};

int main()
{
    std::variant<A, char> f;
    A a;
    static_cast<std::variant<int, float>&>(a) = 10;
    f = a;
    cout << *std::get_if<int>(std::get_if<A>(&f));
    return 0;
}

相关问题