我正在尝试比较具有相同类型的常量引用和非常量可选对象。我有一个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?

那是未定义的行为。

关于c++ - 比较boost::optional <T&>与const T&,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31013848/

10-09 06:34