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概念中所述的行爲嗎?
我一直在尋找這樣的標準版本。你能否給我提供一個鏈接到我可以找到它的地方?我正在使用密集的概念......我需要它。謝謝。 – Oliv
@Oliv添加了鏈接。 –