比较 boost::optional<T&> 与 const T&

Comparing a boost::optional<T&> to const T&

本文关键字:gt const lt boost optional 比较      更新时间:2023-10-16

我试图比较一个常量引用和一个具有相同类型的非常量可选对象。我有一个类型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<NonCopy>(例如bool boost::operator!=(const boost::optional<NonCopy>&, const boost::optional<NonCopy>&))上而不是在NonCopy上。

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

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?

这是未定义的行为。