簡體   English   中英

當一個對象同時提供`operator!`和`operator bool`時,它在表達式`!obj`中使用?

[英]When an object provides both `operator!` and `operator bool`, which is used in the expression `!obj`?

我遇到了一個我無法自己回答的問題。 此外,我沒有在谷歌和這里找到答案。 比如,我想在if子句中“檢查對象的有效性”,如下所示:

MyClass myObject;

// [some code, if any]

if (!myObject)
{
    // [do something]
}

MyClass定義如下:

class MyClass
{
public:
    MyClass() { };
    virtual ~MyClass() { };
    bool operator!()
    {
        return !myBool;
    };
    operator bool()
    {
        return myBool;
    };
private:
    bool myBool = 0;
};

我現在的問題是:在這個if子句中實際使用了哪一個重載運算符? 無論哪種方式,結果顯然都是一樣的。

它將使用operator!

將優先選擇參數類型與參數匹配的函數,而不是需要類型轉換的函數。

你會找到那個operator ! 被執行因為它是最直接的解決方案。 如果它使用operator bool而不是它必須首先調用轉換運算符,然后應用! 與此分開。

作為一般規則,盡管避免這種情況是個好主意。 通常更好的方法是定義bool轉換,因為嚴格來說這就是你希望你的邏輯運算符所做的事情,而不是直接的MyClass 定義兩者都會產生一些可讀性問題,並且是冗余代碼復制的一種形式(將來可能導致程序員錯誤)。

暫無
暫無

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

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