5

我从未使用过std::get_if,并且由于它的名称与 不同std::get,因此我看不出它的参数应该是指针¹(而std::get具有引用参数)的原因。


¹如果它也被命名std::get,那么重载决议就足够了。


是的,我的问题可能是因为 std:: any_cast () 和 std::get_if(std::variant) 绝对有必要将指针作为参数?,但关键是那里没有解决vs的答案,只有一条评论;唯一的答案集中在.std::get_ifstd::getstd::any_cast

4

2 回答 2

5

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

因为它返回了指针,所以它必须取variant. 如果它接受 的引用variant,那么它必须能够接受、和的类型variant&,但指针保持引用限定是没有意义的。const variant&variant&&const variant&&

考虑到get_ifaccept variant&&,你所做的是返回一个 xvalue 的地址,这很糟糕。即使get_if只允许variant&and const variant&,后者仍然可以接受 avariant&&并返回一个 dangling。

于 2021-09-22T04:28:36.613 回答
3

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

类似地,可能失败的 get 需要一个指针并返回一个。

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

于 2021-09-21T14:45:53.397 回答