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& Fuck (const Fuck& t);

不是拷貝構造。拷貝構造要求類型相同。如果U == T的話,會被匹配到真的拷貝構造。這是用一個類型轉成另一個類型的時候才會調用的。

然而這些都沒關係,因為都=delete了。

話說,密集的髒話是不好的,應該消音。向美國的電視那樣吧,用Frog代替。


在第一段代碼中,最後一個構造函數允許你用 Fuck& 構造 Fuck&

適用場景在標準庫里就能找到,std::shared_ptr 有類似的構造函數。

這種函數不是複製構造函數,因為複製構造函數不能是模板函數。


最後一個函數應該叫做類型轉換構造函數,它可以把一個Fuck&的類型轉換成Fuck&,也就是模版參數不同的模版類。這個應用就是比如說我有一個int類型的數組,要用來傳遞給一個double類型數組的參數,這個構造函數就可以完成這個轉換,即可以顯示調用,也可以隱式調用。包括:

Fuck& int_f;
Fuck& double_f(int_f); // 顯示調用
Fuck& double_f2 = int_f; // 顯示調用2
int my_func(const Fuck& double_f);
my_func(Fuck&(int_f)); // 顯示調用3
my_func(int_f); // 隱式調用

template&
T my_func2(T, const Fuck&);

my_func2&(0.0, int_f); // 隱式調用2


這位朋友的代碼命名規則有點怪…

template& class Fuck

{

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&);//左值引用構造Fuck(Fuck&);//移動構造

但是我們可以看見後面有一個特殊的構造template&Fuck(const Fuck& t)我們可以看到這個構造函數有一個模板參數,其接受的Fuck類擁有的是一個獨立的模板參數,這樣接受的Fuck類的模板參數就可以與Fuck類本身的模板參數不同。但是嚴格來說這並不屬於拷貝構造函數。這只不過可以實現給Fuck&賦予Fuck&的值。

我不太推薦這樣做。因為這樣可能會產生一些不可預期的錯誤,而且你在實現此類函數時也要考慮到怎麼實現類型之間的安全轉換。


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()) 正常?

TAG:模板 | C | 拷貝構造函數 |