我从来没有使用过std::get_if
,因为它的名字不同于std::get
,我看不出为什么它的参数应该是指针¹(而std::get
有一个引用参数)。
¹如果它也被命名为std::get
,那么重载解决将是一个足够的理由。
是的,我的问题可以被欺骗为问题std::any_cast()和std::get_if(std::variant)绝对有必要将指针作为参数吗?,但关键是没有答案地址std::get_if
和std::get
,只是一个评论;唯一的答案是std::any_cast
。
这是因为get_if
是noexcept
,所以永远不会抛出异常。为了实现这一点,它必须返回一个pointer
,以便在访问失败时可以返回nullptr
。
因为它返回了指针,所以它必须接受variant
的指针。如果它接受variant
的引用,那么它必须能够接受variant&
、const variant&
、variant&&
和const variant&&
的类型,但是对于指针来说,保持引用限定是没有意义的。
考虑到get_if
接受variant&&
,您所做的是返回一个xvalue的地址,这很糟糕。即使get_if
只允许variant&
和const variant&
,后者仍然可以接受variant&&
并返回悬空。
据我所知,它是基于动态转换逻辑的。可能失败的动态强制转换接受一个指针并返回一个指针。
类似地,get可以失败,接受一个指针并返回一个。
但实际上它看起来像是一个不太重要的小决定。
这个设计允许你使用"chained"像这样的调用:
struct A : public std::variant<int, float>{};
int main()
{
std::variant<A, char> f;
A a;
static_cast<std::variant<int, float>&>(a) = 10;
f = a;
cout << *std::get_if<int>(std::get_if<A>(&f));
return 0;
}