簡體   English   中英

這是構造函數運算符還是轉換運算符?

[英]Is this a constructor operator or conversion operator?

class B
{
    public:
        operator B() const{ }    // What is this and what is the purpose?

    private:
        int m_i;
};

所以問題是,轉換運算符或構造函數運算符是什么用的呢? 在哪里使用它?

它是一個永遠不會被隱式調用的轉換函數。 該標准實際上深入探討了這個問題。 12.3.2 / 1:

轉換函數從不用於將(可能是cv限定的)對象轉換為(可能是cv限定的)相同的對象類型(或對它的引用),轉換為該類型的(可能是cv限定的)基類(或引用它)或(可能是cv-qualified)void。

在腳注中,

這些轉換被視為標准轉換,用於重載解析(13.3.3.1,13.3.3.1.4),因此初始化(8.5)和顯式轉換(5.2.9)。 轉換為void不會調用任何轉換函數(5.2.9)。 即使從未直接調用執行轉換, 也可以聲明此類轉換函數,並且可以通過調用基類中的虛擬轉換函數來實現。

此外,轉換函數仍然是正常函數,可以通過名稱顯式調用。

關於虛函數的注釋適用於這樣的代碼:

class B;

struct A {
    virtual operator B() const = 0;
};

struct B : A
{
    public:
        operator B() const{ return B(); } // virtual override

    private:
        int m_i;
};

A const & q = B(); // q has dynamic type B, static type A
B r = q; // Convert A to B using B::operator B()

迂腐:“轉換運算符”是一個很差的術語。 這些被稱為轉換函數 ,盡管有operator關鍵字,但它們不被認為是運算符重載的情況。

它是一個轉換運算符。 它可以讓你投類型的對象B到類型的對象B

暫無
暫無

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

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