[英]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版本上也是一樣的(在線)
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.