簡體   English   中英

C ++隱式轉換構造函數調用

[英]C++ implicit conversion constructor call

為什么gcc需要復制構造函數來進行隱式轉換構造函數調用?

class X
{
public:
        X(int q) {}

        ~X()
        {
                std::cout << "~X()" << std::endl;
        }

        X(const X&) = delete;
};

X x = 1; // gives error: use of deleted function ‘X::X(const X&)’

更有趣的是,如果我甚至寫復制構造函數,它就不會被調用。 析構函數只調用一次,因此以下代碼

class X
{
public:
    X(int q) {}

    ~X()
    {
        std::cout << "~X()" << std::endl;
    }

    X(const X&)
    {
        std::cout << "copy ctor" << std::endl;
    }
};

int main()
{
    X x = 1;
}

打印~X()

是bug嗎? 有沒有解決方法?

我的locaL PC上的gcc版本是4.6.3,這在另一個gcc版本上也是一樣的(在線)

http://ideone.com/ustDRj

X x = 1; 復制初始化的語法 如果初始化器不是類型X (如此處),則在語義上等效於:

X x(X(1));

也就是說,它從參數1構造X的insance,然后從該實例復制初始化x

就像任何其他副本初始化一樣,可以省略副本。 這可能發生在您的情況下,因此實際上不會調用復制構造函數。 仍然,(再次,就像任何其他復制省略一樣),它必須是可用的。

您正在嘗試將值初始化為類對象,此處調用copy-constructor。

int main()
{
    X x = 1; 
}

將代碼更改為

X x(1);

暫無
暫無

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

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