std::get_if (std::variant) 通过指针而不是通过值/&/const& 获取变体参数是否有任何实际原因?

Enr*_*lis 12 c++ pass-by-reference pass-by-pointer c++17 std-variant

我从未使用过std::get_if,并且由于它的名称与 不同std::get,我看不出为什么它的参数应该是指针\xc2\xb9 (而std::get有一个按引用参数)。

\n
\n

\xc2\xb9如果它也被命名std::get,那么重载解析就足够了。

\n
\n

是的,我的问题可能会被欺骗到问题 std::any_cast() 和 std::get_if(std::variant) 是否绝对有必要将指针作为参数?,但关键是没有答案解决std::get_ifvs std::get,只有一个评论;唯一的答案集中在std::any_cast

\n

康桓瑋*_*康桓瑋 16

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

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

考虑到get_ifAccept variant&&,您所做的是返回 xvalue 的地址,这很糟糕。即使get_if只允许variant&and const variant&,后者仍然可以接受 avariant&&并返回 a 悬空。

  • @恩利科。这可以是一个选择,但这也意味着“get_if(std::move(v))”将返回一个“nullptr”,即使返回其地址没有问题。 (2认同)
  • 如有必要,可以通过“=delete”重载轻松解决“variant &&”问题。 (2认同)