【问题标题】: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 (std::variant) 通过指针而不是值/&/const& 获取变体参数是否有任何实际原因?
【发布时间】:2021-11-15 03:15:46
【问题描述】:

我从未使用过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?问题所欺骗,但关键是那里没有答案地址@ 987654329@ vs std::get,只有一条评论;唯一的答案集中在std::any_cast

【问题讨论】:

标签: c++ c++17 pass-by-reference std-variant pass-by-pointer


【解决方案1】:

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

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

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

【讨论】:

  • 第二段的解释我实在看不懂。
  • @Enlico。假设get_if接受引用,那么接受variant&&时应该返回什么类型?
  • variant&& 只会绑定到右值,对吧?那么返回nullptr 不是正确的选择吗?
  • @Enlico。这可以是一个选择,但这也意味着get_if(std::move(v)) 将返回一个nullptr,即使返回其地址没有问题。
  • 就像unique_ptr.get() 我看不出它对variant 无效的原因。
【解决方案2】:

据我所知,它基于动态转换逻辑。可能失败的动态转换需要一个指针并返回一个指针。

同样,get that can fail需要一个指针并返回一个。

但实际上,这看起来像是一个无关紧要的小决定。

【讨论】:

    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多