为什么 std::get_if (std::variant) 通过指针而不是通过值/&/const& 采用变体参数有什么实际原因吗?

Is there any practical reason why std::get_if (std::variant) takes a variant argument by pointer instead of by value/&/const&?

我从未使用过 std::get_if, and since its name is different from 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?,但重点是没有answer 那里解决了 std::get_ifstd::get,只有一个评论;唯一的答案集中在 std::any_cast.

据我所知,它基于动态转换逻辑。可能失败的动态转换需要一个指针和 returns 一个指针。

类似地,可能会失败的 get 需要一个指针,returns 一个。

但实际上这看起来像是一个无关紧要的小自行车棚决定。

这是因为get_ifnoexcept,所以永远不会抛出异常。为了实现这一点,它必须 return 一个 pointer 以便在访问失败时 nullptr 可以被 returned。

因为它return编辑了指针,所以它必须使用variant的指针。如果它采用 variant 的引用,那么它必须能够接受 variant&const variant&variant&&const variant&& 的类型,但它不能指针保持引用合格是有意义的。

考虑到 get_if 接受 variant&&,你做的是 return 一个 xvalue 的地址,这很糟糕。即使get_if只允许variant&const variant&,后者仍然可以接受variant&&和return悬垂。