【问题标题】:Comparing a boost::optional<T&> to const T&比较 boost::optional<T&> 和 const T&
【发布时间】:2015-06-23 21:28:11
【问题描述】:

我正在尝试比较具有相同类型的常量引用和非常量可选对象。我有一个类型,NonCopy,它是不可复制的

#include <iostream>
#include <boost/optional.hpp>

struct NonCopy {
    NonCopy() { }
    NonCopy(const NonCopy&) = delete;
    NonCopy& operator=(const NonCopy&) = delete;
};

int main()
{
    NonCopy nc;
    const NonCopy& object = nc;
    boost::optional<NonCopy&> object2 = nc;

    if (!object2 && object2.get() != object) {
        std::cout << "not equal?\n";
    }
}

产量

error: no match for ‘operator!=’ (operand types are ‘boost::optional_detail::types_when_is_ref<NonCopy&>::raw_type {aka NonCopy}’ and ‘const NonCopy’)

我尝试了多种主题变体,包括

if (object2 && const_cast<const NonCopy&>(object2.get()) != object)

这会产生一个非常有趣的错误

error: no match for ‘operator!=’ (operand types are ‘const NonCopy’ and ‘const NonCopy’)

并在boost::optional&lt;NonCopy&gt;(例如bool boost::operator!=(const boost::optional&lt;NonCopy&gt;&amp;, const boost::optional&lt;NonCopy&gt;&amp;))而不是NonCopy 上列出!= 的候选者。

【问题讨论】:

  • 在我看来,这种类型根本没有可比性。
  • 它是……陷入指针思维。我以为 != 会比较两个引用是否指向同一个对象
  • @Outurnate:您可以通过&amp;(object2.get()) != &amp;object 找到答案。或者,如果你真的很偏执,请使用std::addressof
  • addressof... 这是一个新的。谢谢!

标签: c++ templates boost operator-overloading constants


【解决方案1】:

由于object2.get() 返回NonCopy&amp;,因此您的示例有效地简化为:

NonCopy nc;
const NonCopy& object = nc;
NonCopy& object2 = nc;

object != object2; // error: no match for operator!=

这仅仅意味着您的类型NonCopy 没有operator!=。实现它,您的代码将编译。 boost::optional 在这里不相关。

虽然请注意您正在检查:

if (!object2 && object2.get() != object)
    ^^^^^^^^    ^^^^^^^^^^^^^
    object2 is none, but get it anyway?

这是未定义的行为。

【讨论】:

  • 啊!我现在明白了。我的印象是引用类型可以让我比较那个引用对象(也就是说,两个引用都引用同一个对象,很像一个指针)
  • 并且 +1 用于发现一个不相关的逻辑错误...我正在尝试摆脱我的代码库中的裸指针,我猜有一个漏掉了
  • @Outurnate 不,指针指向对象,但引用对象。如果要比较地址,则必须明确检查 &amp;object&amp;object.get()
  • reference 是让我失望的对象。现在这更有意义了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
相关资源
最近更新 更多