std::get_if (std::variant) 通过指针而不是 value/&/const& 获取变体参数有什么实际原因吗?



我从来没有使用过std::get_if,因为它的名字不同于std::get,我看不出为什么它的参数应该是指针¹(而std::get有一个引用参数)。


¹如果它也被命名为std::get,那么重载解决将是一个足够的理由。


是的,我的问题可以被欺骗为问题std::any_cast()和std::get_if(std::variant)绝对有必要将指针作为参数吗?,但关键是没有答案地址std::get_ifstd::get,只是一个评论;唯一的答案是std::any_cast

这是因为get_ifnoexcept,所以永远不会抛出异常。为了实现这一点,它必须返回一个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;
}

相关内容

  • 没有找到相关文章