[英]assignment operator by value not compiling with explicit copy constructor
我想了解在顯式復制構造函數中應使用哪些正確的參數類型。
如下定義,使用“顯式”將不會編譯分配代碼。 main中的賦值行生成錯誤:“沒有匹配的構造函數來初始化CCat”
從第一個副本構造函數中刪除“顯式”可解決此問題,但我不明白為什么。
編譯器顯然在進行一些隱式的強制轉換?
class CCat : public CAnimal
{
public:
explicit CCat( string name, uint noLegs, bool fur, bool domestic, string breed );
explicit CCat( const CCat& oldCat ) : CAnimal( oldCat )
{
std::cout << "\nCCat::CCat( const CCat& oldCat ) \n";
}
explicit CCat( CCat& oldCat ) : CAnimal( oldCat )
{
std::cout << "\nexplicit CCat::CCat( CCat& oldCat ) \n";
}
~CCat();
CCat& operator =( CCat oldCat ){
//.. do assignment stuff
return *this;
}
};
int main(int argc, const char * argv[])
{
CCat *cat1 = new CCat( string("Wiggy"), 4, true, true, string("Tabby") );
CCat *cat2 = new CCat( string("Tibles"), 4, true, true, string("Tom") );
CCat tempCat( *cat1 );
CCat tempCat2( *cat2 );
std::cout << "CCat tempCat2( *cat2 );\n";
const CCat& tempCat3 = *cat2;
tempCat = tempCat3; // will not compile without explicit removed from first C/Constr
tempCat = CCat(*cat2); // will not compile without explicit removed from first C/Constr
tempCat = tempCat2; // will not compile without explicit removed from first C/Constr
return 0;
}
賦值運算符(按值傳遞)強制使用副本構造函數,但是使用顯式時找不到完美匹配。 因此,在刪除顯式后,編譯器將執行哪些轉換,以及如何編寫匹配的副本構造函數?
分配
tempCat = tempCat3
通過過載解析進行調查,並重寫為
tempCat.operator=(tempCat3)
現在,重載解析將查找要調用的匹配成員函數。 它會找到您的副本分配運算符:
CCat& operator=( CCat oldCat )
必須使用參數oldCat
初始化參數tempCat3
。 正確的術語實際上是復制初始化 。
初始化形式
T x = b;
與參數傳遞一樣,[…]也稱為復制初始化 。
復制初始化僅適用於非顯式構造函數:
對於復制初始化,候選函數是該類的所有轉換構造函數(12.3.1)。
(也稱為轉換構造函數):
在沒有
explicit
指定函數說明符的情況下聲明的構造函數指定了從其參數類型到其類類型的轉換。 這樣的構造函數稱為轉換構造函數 。
因此,如果您使用const
-reference參數將您的復制構造const
聲明為explicit
,則它不是轉換構造函數,則復制初始化無效,並且該參數無法使用參數進行初始化-這也是編譯器告訴我們的,找不到匹配的構造函數。
main
的其他行也是如此。
如果explicit
刪除,則初始化工作正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.