差異

2015-12-08 25 views
1

N4527 14.6 [temp.res]/P8差異

如果模板的一個假設實例化其定義立即 以下將由於不依賴於模板參數的構造而不合格,該程序不合格;不需要診斷。如果對假設實例化中這種構建體的解釋不同於對任何實際模板實例化中相應構造體的解釋,則該程序是不合格的;不需要診斷。 [注:這可以在情況,包括以下發生 :

(8.1) - 在一個非從屬名稱使用的類型是在將在哪個模板定義但 完成在該點的點不完全在該實例化被執行,或

(8.2) - 的實例化使用沒有在 在該模板定義點已定義的默認參數或默認模板參數,或

( 8.3) - constan模板實例內噸表情評估(5.20)使用

(8.3.1) - 積分或無作用域枚舉類型

(8.3.2)的一個const對象的值 - 該值一個參考值或

(8.3.4) - - 一個constexpr對象或

(8.3.3)的constexpr函數的定義,

和實體定義模板時沒有定義,或者

那麼,這些代碼形成不良?

代碼1:

extern double b; 

template<class T> 
void f(T=b){} 

void g(){ 
    f<double>();//ill-formed or not? 
} 

double b = 0; 

void h(){ 
    f<double>();//ill-formed or not? 
} 

代碼2:

//translation 1 
extern double b; 

template<class T> 
void f(T=b){} 

void g(){ 
    f<double>();//ill-formed or not? 
} 

//translation 2 
double b = 0; 

而且Issue1850 Differences between definition context and point of instantiation

實體的各種特性稱爲由非相關的參考模板中的可以改變在定義上下文和特例的實例化點之間該模板。其中包括初始化(影響對象是否可用於常量表達式),函數和模板默認參數以及類型的完整性。關於這些內容是在定義上下文還是在實例化點進行檢查,存在實現差異。如果這種參考的有效性在兩種情況之間變化,那麼大概需要一條規則來使其不健全,不需要診斷。

你能告訴我怎麼都是非依賴的名字特性的兩個上下文之間的不同更多的例子嗎?典型地爲約8.2和8.3.1

+0

這些實施例是關於「如果在假想實例化這樣的構建體的解釋是從的解釋不同的相應構造在該模板的任何實際的實例中,程序是非法的構造;沒有診斷是必需的「,但不要證明這一點。 f的瞬時值將是相同的。但是,我想不出一個涉及默認函數參數的正確示例。 –

+1

呵呵,重載分辨率。有可能。例如。與遞歸調用。 –

+2

@ Cheersandhth.-Alf易於構建一個:'void g(long); void g(int,int);模板 void f(){g(0); } void g(int,int = 0){}'編輯:儘管如此,兩階段查找可能會阻止這一個。 –

回答

1

下面是一個例子:

extern const int b; 

template<int, int> 
void f(int); 

template<int, const int &> 
void f(long); 

template<class> 
void g() { 
    f<0, b>(0); 
} 
// #1 

extern const int b = 0; 


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

// #2 

在#1的假想實例將調用void f<0, b>(long),因爲b不是在該點處的常量表達式,所以(int)過載SFINAEs遠。 #2(這是g<int>實例化的一個點)的實例化將調用void f<0, 0>(int),因爲那時b是一個常量表達式,(int)過載是可行的並且勝過超載分辨率。

Clang and GCC will in fact call different fs with this code.