我从来没有使用过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
上。
3条答案
按热度按时间nlejzf6q1#
这是因为
get_if
是noexcept
,所以永远不会抛出异常,为了实现这一点,它必须返回一个pointer
,以便在访问失败时返回nullptr
。因为它返回了指针,所以它必须接受
variant
的指针。如果它接受variant
的引用,那么它必须能够接受variant&
、const variant&
、variant&&
和const variant&&
的类型,但是指针保持ref限定没有意义。考虑到
get_if
接受variant&&
,你所做的就是返回一个xvalue的地址,这是很糟糕的,即使get_if
只允许variant&
和const variant&
,后者仍然可以接受一个variant&&
,并返回一个悬空的。xxhby3vn2#
据我所知,它是基于动态强制转换逻辑的。可能失败的动态强制转换接受一个指针并返回一个指针。
类似地,get可以失败,它接受一个指针并返回一个。
但实际上,它看起来像一个小自行车舍的决定没有多大的重要性。
qnyhuwrf3#
这种设计允许您应用“链式”调用,如下所示: