簡體   English   中英

什么時候發生非依賴名稱的重載解析,在定義上下文或實例化點?

[英]When does overload resolution of non-dependent name take place, in definition context or point of instantiation?

3.4 [basic.lookup] / p1

名稱查找成功后,將發生重載分辨率(13.3)。

void g(long);

void g(int, int);

template<class T> void f() { g(0); }

void g(int, int = 0) {}

int main(){
    f<int>();
}

gcc匯編成功,clang faild。

什么時候發生非依賴名稱的重載解析,在定義上下文或實例化點? 或者兩者都對嗎?

在這兩種情況下。

[temp.res] 14.6 \\ 8

如果由於不依賴於模板參數的構造而導致緊接其定義之后的模板的假設實例化將是不正確的,則該程序是不正確的; 無需診斷。 如果在假設實例中對這種結構的解釋與模板的任何實際實例中對應結構的解釋不同,則該程序是不正確的; 無需診斷。

[temp.nondep] 14.6.3 \\ 1

模板定義中使用的非依賴名稱可以使用通常的名稱查找找到,並在使用它們時綁定。

所以兩個編譯器都是正確的。

如果我對查找規則的理解是正確的,那么因為g()是非依賴名稱,所以在第2階段不會將重載集添加到。因此,在定義點上g(0)的唯一選擇是g(long) ,而且Clang是正確的。

考慮到定義的順序,我當然會天真地期望只考慮g(long) ,但是當涉及模板時,C ++標准並不總是直觀的...

暫無
暫無

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

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