簡體   English   中英

function 模板的實例化點

[英]Point of Instantiation for function templates

我正在學習 C++ 中的模板。特別是,我閱讀了 POI。 所以我正在嘗試(通過閱讀和寫作)不同的例子。 下面給出了一個我不清楚的例子:

template<typename T>
void g1(T p)
{

}
template<typename T>
void f1(T x)
{
g1(x); // #1: Is this point a POI for g1<T>(x)?
}
//#2: Or is this point a POI for g1<T>(x)?


//#3: Or is this point a POI for g1<T>(x)?
int main()
{
f1(7); // this point cannot be a POI 
}
// #4 I know that this point 4 is a  POI for f1<int>(int) but is this point also a POI for g<T>(x)?

在上面的代碼片段中,我知道#4點是f1<int>(int)的興趣點。 但是點#4也是g1<T>(x)的興趣點嗎? 我知道在語句g1(x); 名稱g1是一個不合格的從屬名稱 我也知道興趣點

使對 function 模板特化的引用緊接在包含該引用的最近命名空間 scope 聲明或定義之后。

這就是為什么#4點是f<int>(int)的興趣點。 但類似地,點#2應該是g1(x); . 但我不確定g1(x); . 那么,為諸如g1之類的非限定從屬名稱查找 POI 的規則是什么?

我的問題是:

  1. #4點也是g1<T>(x)的興趣點嗎? 如果是,那么為諸如g1之類的不合格從屬名稱查找 POI 的規則是什么。

  2. 根據我引用的聲明(來自 C++ 模板:完整指南), #2點不應該是g1<T>(x); . 我想這歸結為語句g1(x); 指的是 function 模板專業化。 如果是,那么根據引用的陳述,點#2應該是g<T>(x); . 我在這里可能是錯的。

  3. 如果我刪除語句f1(7); . 據我了解,此翻譯單元將不再有 POI。 但我不是 100% 確定這一點。 或刪除f1(7); 現在將使程序格式錯誤。

function 模板的實例化點在表面上非常簡單:它是編譯器首先看到具體 function 的地方。

g1是function模板; 它是一個編譯器構造,可根據模板參數生成一系列函數。 g1<int>是具體的 function,是編譯器實例化模板g1以生成真實 function 的產物。

當編譯器在f1的定義中看到g1(x)時,它會看到x是一個表達式,其類型取決於模板參數。 但是編譯器還不知道模板參數是什么。 所以它不知道g1(x)會做什么。 是的,它可以看到 function 模板g1 ,但是因為此時x未知的,所以它不知道它會傳遞給g1的什么模板參數。

因此,它無法在此時實例化模板。 它只能在f1本身被實例化時弄清楚如何通過g1(x)實例化g1

因此,C++ 將模板 function 的實例化點推遲到編譯器完全了解任何潛在模板參數的第一個位置。 表達式g1(x)只有在f1的實例化發生時才有意義。 因此,如果你做了一些導致f1<int>被實例化的事情, g1<int>將在同一點被實例化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM