2 回答

TA貢獻(xiàn)1883條經(jīng)驗(yàn) 獲得超3個(gè)贊
的直接背景基本上是什么,你在模板聲明本身看到的。除此之外的一切都是硬錯(cuò)誤。硬錯(cuò)誤示例:
#include <type_traits>template<class T>struct trait{ using type = typename T::type; };template<class T, class U = typename trait<T>::type>void f(int);void f(...);template<class T, class U = typename T::type>void g(int);void g(...);template<class>struct dependent_false : std::false_type{};template<class T>struct X{ static_assert(dependent_false<T>(), "..."); using type = void;};int main(){ f<int>(0); g<X<int>>(0);}

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果您考慮了確定模板參數(shù)替換結(jié)果所需的所有模板和隱式定義的函數(shù),并假設(shè)它們是在替換開(kāi)始之前首先生成的,則在第一步中發(fā)生的任何錯(cuò)誤都不會(huì)立即出現(xiàn),并導(dǎo)致硬錯(cuò)誤。
如果所有這些實(shí)例化和隱式定義(可能包括將函數(shù)定義為已刪除)都可以正確執(zhí)行,那么替換期間(即在引用函數(shù)模板的實(shí)例化模板和隱式定義函數(shù)時(shí))會(huì)發(fā)生任何其他“錯(cuò)誤”。簽名)不是錯(cuò)誤,但會(huì)導(dǎo)致推理失敗。
因此,給定這樣的功能模板:
template<typename T>voidfunc(typename T::type* arg);
以及在其他功能的推論失敗時(shí)將使用的“后備”:
template<typename>voidfunc(...);
和這樣的類(lèi)模板:
template<typename T> struct A { typedef T* type; };
調(diào)用func<A<int&>>(nullptr)
將替代A<int&>
,T
并且為了檢查是否T::type
存在,必須實(shí)例化A<int&>
。如果我們?cè)O(shè)想在調(diào)用之前放一個(gè)顯式實(shí)例化func<A<int&>(nullptr)
:
template class A<int&>;
那么這將失敗,因?yàn)樗鼑L試創(chuàng)建類(lèi)型int&*
并且不允許使用指向引用的指針。我們沒(méi)有到檢查替換是否成功的地步,因?yàn)閷?shí)例化存在一個(gè)嚴(yán)重的錯(cuò)誤A<int&>
。
現(xiàn)在,我們有一個(gè)明確的專(zhuān)業(yè)化A
:
template<> struct A<char> { };
對(duì)的調(diào)用func<A<char>>(nullptr)
需要實(shí)例化A<char>
,因此請(qǐng)想象在調(diào)用之前程序中某個(gè)地方的顯式實(shí)例化:
template class A<char>;
此實(shí)例化還可以,沒(méi)有任何錯(cuò)誤,因此我們繼續(xù)進(jìn)行參數(shù)替換。work的實(shí)例化A<char>
,但A<char>::type
不存在,但是可以,因?yàn)樗鼉H在的聲明中引用func
,因此只會(huì)導(dǎo)致參數(shù)推導(dǎo)失敗,而...
將調(diào)用后備功能。
在其他情況下,替換可能導(dǎo)致特殊成員函數(shù)被隱式定義(可能已刪除),這可能會(huì)觸發(fā)其他實(shí)例化或隱式定義。如果在“生成實(shí)例和隱式定義”階段發(fā)生錯(cuò)誤,那么它們就是錯(cuò)誤,但是如果成功但在替換期間發(fā)生錯(cuò)誤,則函數(shù)模板簽名中的表達(dá)式將變?yōu)闊o(wú)效,例如,因?yàn)樗褂玫某蓡T不存在或被隱式定義為刪除的東西,這不是錯(cuò)誤,只是推論失敗。
因此,我使用的思維模型是,替換需要首先執(zhí)行“準(zhǔn)備”步驟才能生成類(lèi)型和成員,這可能會(huì)導(dǎo)致嚴(yán)重錯(cuò)誤,但是一旦我們完成了所有必要的生成,任何進(jìn)一步的無(wú)效使用就不會(huì)出錯(cuò)。當(dāng)然,這一切都是將問(wèn)題從“ 即時(shí)上下文是什么意思?” 移開(kāi)?!霸跈z查此替換之前需要生成哪些類(lèi)型和成員?” 因此它可能會(huì)或可能不會(huì)幫助您!
- 2 回答
- 0 關(guān)注
- 713 瀏覽
添加回答
舉報(bào)