2017-01-23 50 views
3

在C++標準,N4618/[temp.deduct](§14.8.2),下面的例子(§14.8.2/ 7)演示模板參數替代是如何詞彙順序執行:聲明中的參數替換之後是否需要評估子句?

template <class T> struct A { using X = typename T::X; }; 
template <class T> typename T::X f(typename A<T>::X); 
template <class T> void f(...) { } 
template <class T> auto g(typename A<T>::X) -> typename T::X; 
template <class T> void g(...) { } 
void h() { 
    f<int>(0);// OK, substituting return type causes deduction to fail 
    g<int>(0);// error, substituting parameter type instantiates A<int> 
} 

我期待在聲明內容之前對需求子句內容進行評估。我預計下面的修改不會產生任何編譯錯誤:

template <class T> struct A { using X = typename T::X; }; 
template <class T> typename T::X f(typename A<T>::X); 
template <class T> void f(...) { } 
template <class T> 
requires false 
auto g(typename A<T>::X) -> typename T::X; 
template <class T> 
requires true 
void g(...) { } 
void h() { 
    f<int>(0);// OK, substituting return type causes deduction to fail 
    g<int>(0);// error, substituting parameter type instantiates A<int> 
} 

其實GCC告訴我仍然有錯誤。這是TS概念中所述的行爲嗎?

回答

2

是的。見音符N4630 [temp.deduct]/5:

The satisfaction of constraints (14.10) associated with the function template specialization is determined during overload resolution (13.3), and not at the point of substitution.

+0

我一直在尋找這樣的標準版本。你能否給我提供一個鏈接到我可以找到它的地方?我正在使用密集的概念......我需要它。謝謝。 – Oliv

+0

@Oliv添加了鏈接。 –