它說:
從函式模板生成的函式永遠不會等同于普通函式,即使它們可能具有相同的型別和相同的名稱。這對班級成員有兩個重要影響:
- 從建構式模板生成的建構式永遠不是默認的復制建構式。
首先,我不明白這個結論是如何從第一個陳述中得出的。
其次,當我試圖模擬那個結論時,它給了我一個不能多載的錯誤,所以我也不明白結果。
編輯:我使用的代碼
#include <iostream>
template<class T>
class entity
{
private:
int x;
public:
entity();
entity (int const& y):x(y)
{
printf("non-template");
}
entity (T const& y): x(y)
{
}
};
int main()
{
entity<int> en(5);
}
uj5u.com熱心網友回復:
復制建構式是具有特定簽名的非模板建構式。建構式模板的特化絕不是(根據定義)復制建構式。
我認為“后果”在這里并沒有真正用來表示緊接在前面的陳述之后的邏輯含義。我認為這只是為了演示一些示例,其中普通函式和從函式模板專門化的函式之間的區別很重要。
這種“后果”一詞的使用似乎是一種語言上的怪異。我有時會看到它是這樣使用的。它似乎真的意味著更像“這允許以下內容(并且以下內容是正確的) ”。
這里的重點是,只有宣告復制建構式(即非模板建構式)才能禁止宣告隱式復制建構式。所以如果你只宣告一個建構式模板,它可以被專門化為具有與復制建構式相同的簽名,那么仍然會有一個隱式的復制建構式。
我不知道作者在“默認復制建構式”中使用“默認”是什么意思。我通常猜想他們只是使用了“隱式”的非正式變體,但這在背景關系中沒有意義。
在您的示例代碼中沒有建構式模板。模板的宣告以template</*...*/>(或從 C 20 開始作為在引數型別中具有auto占位符的函式)開始。
entity (T const& y): x(y)
{
}
這只是一個普通的非模板建構式。它的引數型別確實取決于類的模板引數,但這并不能使其本身成為模板(盡管是模板化的物體)。即使撇開這一點不談,如果您將類專門化為 eg entity<int>,那么引數將變為 type int const&,而不是entitiy<int> const&,因此它根本沒有復制建構式的簽名。編譯器抱怨不可能的多載,因為已經有另一個建構式具有完全相同的引數串列,并且兩者都是非模板建構式。
建構式模板將是例如:
template<typename U>
entity (U const& y): x(y)
{
}
并且這個不會禁止隱式復制建構式的隱式宣告和定義,盡管它可以專門用于entity(entity<T> const&)for U = entity<T>。多載決議仍然會選擇隱式復制建構式而不是這個建構式模板來執行復制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/496357.html
下一篇:c 入門加部分專業化問題
