簡體   English   中英

比較boost :: optional <T&> const T&

[英]Comparing a boost::optional<T&> to const T&

我正在嘗試比較具有相同類型的常量引用和非常量可選對象。 我有一個NonCopy類型,它是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?

那是未定義的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM