将boost :: optional <T&>与const T&进行比较

Out*_*ate 2 c++ templates boost const operator-overloading

我试图比较常量引用和具有相同类型的非常量可选对象.我有一个类型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";
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个收益率

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

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

if (object2 && const_cast<const NonCopy&>(object2.get()) != object)
Run Code Online (Sandbox Code Playgroud)

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

error: no match for ‘operator!=’ (operand types are ‘const NonCopy’ and ‘const NonCopy’)
Run Code Online (Sandbox Code Playgroud)

并列出!= on boost::optional<NonCopy>(例如bool boost::operator!=(const boost::optional<NonCopy>&, const boost::optional<NonCopy>&))的候选者,而不是on NonCopy.

Bar*_*rry 5

由于object2.get()回报NonCopy&,你的榜样有效地简化为:

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

object != object2; // error: no match for operator!=
Run Code Online (Sandbox Code Playgroud)

这只是意味着你的类型NonCopy没有operator!=.实现它,你的代码将编译.boost::optional与此无关.

虽然请注意您正在检查:

if (!object2 && object2.get() != object)
    ^^^^^^^^    ^^^^^^^^^^^^^
    object2 is none, but get it anyway?
Run Code Online (Sandbox Code Playgroud)

这是未定义的行为.

  • @Outurnate Nope,指针指向对象,但引用**是对象.如果你想比较地址,你必须明确检查`&object` vs`&object.get()`. (2认同)