为什么 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_if
与 std::get
,只有一个评论;唯一的答案集中在 std::any_cast
.
据我所知,它基于动态转换逻辑。可能失败的动态转换需要一个指针和 returns 一个指针。
类似地,可能会失败的 get 需要一个指针,returns 一个。
但实际上这看起来像是一个无关紧要的小自行车棚决定。
这是因为get_if
是noexcept
,所以永远不会抛出异常。为了实现这一点,它必须 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悬垂。
我从未使用过 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_if
与 std::get
,只有一个评论;唯一的答案集中在 std::any_cast
.
据我所知,它基于动态转换逻辑。可能失败的动态转换需要一个指针和 returns 一个指针。
类似地,可能会失败的 get 需要一个指针,returns 一个。
但实际上这看起来像是一个无关紧要的小自行车棚决定。
这是因为get_if
是noexcept
,所以永远不会抛出异常。为了实现这一点,它必须 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悬垂。