c++模板類拷貝構造函數的問題,有點疑惑?
最近讀了點別人的代碼,其中一個模板類有點看不懂,代碼大概如下:
template&
class Fuck {
public:
Fuck ();
Fuck (const test t) = delete;
Fuck (const test t) = delete;
template&Fuck (const Fuck& t) = delete; //這個構造函數是什麼意思
};
最後這個函數也是拷貝構造函數么?它的適用場景是什麼樣子的啊?
Fuck (const test t);
template&Fuck (const Fuck& t);
這倆的區別是什麼?
翻了半天書沒找到相關的用法,求各位巨巨不吝賜教~~
template&
不是拷貝構造。拷貝構造要求類型相同。如果U == T的話,會被匹配到真的拷貝構造。這是用一個類型轉成另一個類型的時候才會調用的。
然而這些都沒關係,因為都=delete了。
話說,密集的髒話是不好的,應該消音。向美國的電視那樣吧,用Frog代替。在第一段代碼中,最後一個構造函數允許你用 Fuck&
最後一個函數應該叫做類型轉換構造函數,它可以把一個Fuck&的類型轉換成Fuck&
Fuck&
Fuck&
Fuck&
int my_func(const Fuck&
my_func(Fuck&
my_func(int_f); // 隱式調用
template&
T my_func2(T, const Fuck&
my_func2&
這位朋友的代碼命名規則有點怪…
template&
{
public:
Fuck();
Fuck(const test t)=delete;
Fuck(const test t)=delete;
template&
Fuck(const Fuck& t)=delete; //這個構造函數是什麼意思
};
這段代碼前面應該還有一個test類。第一個構造函數是默認構造,第二個和第三個是Fuck類以test類的對象作為參數來構造的函數,並不是拷貝構造函數(事實上這裡根本沒定義拷貝構造行不行)
那麼拷貝構造長啥樣呢?
Fuck(const Fuck);//左值引用構造
Fuck(Fuck);//移動構造
在模板類中,這裡要求接受的Fuck類對象的模板參數與Fuck類本身的模板參數相同。實際上這兩個函數都省略了模板參數:
Fuck(const Fuck&
但是我們可以看見後面有一個特殊的構造template&
我不太推薦這樣做。因為這樣可能會產生一些不可預期的錯誤,而且你在實現此類函數時也要考慮到怎麼實現類型之間的安全轉換。
delete是c++11引入的,它表示任何對應函數的調用都不會成功,詳細請參閱http://en.cppreference.com/w/cpp/language/function
推薦閱讀:
※std::move(expr)和std::forward(expr)參數推導的疑問?
※C++ delete[] 是如何知道數組大小的?
※面向對象編程(oop)從誕生到現在理念上經歷了幾次怎樣大的變遷和轉化?
※C++ 11為什麼引入nullptr?
※為什麼判斷 std::vector 是否為空時,用 if(0==vec.size()) 提示效率低,但用 if (vec.empty()) 正常?