atemplate在使用之前不會實體化的事實,例如,如果我有這個類模板:
template <typename T>
struct Pow{
T operator()(T const& x) const{ return x * x; }
};
void func(Pow<double>); // Pow<double> instantiated here?
void func(Pow<int>){} // Pow<int> instantiated here?
int main(){
Pow<int> pi; // instantiated here?
func(pi); // Pow<int> instantiated here
}
那么模板究竟是什么時候實體化的呢?
那么
Pow<int>在func(Pow<int>)宣告時實體化?如果我沒有使用
Pow<int>inmain()那么它是否被實體化了,因為它使用 infunc作為其引數的型別?
uj5u.com熱心網友回復:
類模板隱式實體化的一般規則如下
[temp.inst]
2除非類模板特化是宣告的特化,否則當在需要完全定義的物件型別的背景關系中參考特化或型別別的完整性影響程式的語意時,類模板特化被隱式實體化。[...]
結合這個關于函式的要求:
[dcl.fct.def.general](強調我的)
2在函式定義中,要么是 void declarator ;或宣告符;應該是 [dcl.fct] 中描述的格式良好的函式宣告。函式只能在命名空間或類范圍內定義。函式定義的引數型別或回傳型別不應是函式體內不完整或抽象的(可能是 cv 限定的)型別別,除非該函式被洗掉 ([dcl.fct.def.delete]) .
告訴我們檢查您的程式需要知道的所有資訊。函式宣告不需要完整的型別別。所以...
Pow<double>在這里實體化?
不。這是一個函式宣告,而不是定義。它不需要引數的完整型別別。Pow<double>沒有隱式實體化。
Pow<int>在這里實體化?
是的。這是一個函式定義,因此需要一個實體化。
Pow<int> pi;// 在這里實體化?
由于該功能,已經實體化。
那么模板究竟是什么時候實體化的呢?
嚴格以影響程式語意的方式需要時。
那么
Pow<int>在func(Pow<int>)宣告時實體化?
當func(Pow<int>)被定義。
如果我沒有使用
Pow<int>inmain()那么它是否被實體化了,因為它使用 infunc作為其引數的型別?
是的,因為您在函式定義中這樣做了。
uj5u.com熱心網友回復:
在您的示例中,當編譯器看到創建模板類的物件時,它會被實體化:
Pow<int> pi;
C 標準說:
17.8.1 隱式實體化 [temp.inst]
1 除非已顯式實體化 (17.8.2) 或顯式特化 (17.8.3) 類模板特化,否則當在需要完全定義的物件型別的背景關系中參考特化時,或當型別別的完整性會影響程式的語意...
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/328468.html
