第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

SFINAE適用的C ++ 11標(biāo)準(zhǔn)中提到的“即時(shí)上下文”到底是什么?

SFINAE適用的C ++ 11標(biāo)準(zhǔn)中提到的“即時(shí)上下文”到底是什么?

C++
函數(shù)式編程 2019-09-26 10:30:46
C ++ 11標(biāo)準(zhǔn)的14.8.2 / 8段規(guī)定了替換失敗應(yīng)或不應(yīng)該導(dǎo)致“硬”編譯錯(cuò)誤(從而導(dǎo)致編譯失?。┗颉败洝卞e(cuò)誤的條件,使編譯器從一組候選集中丟棄模板以進(jìn)行重載解決(而不會(huì)使編譯失敗并啟用眾所周知的SFINAE慣用語(yǔ)):如果替換導(dǎo)致無(wú)效的類(lèi)型或表達(dá)式,則類(lèi)型推導(dǎo)將失敗。無(wú)效的類(lèi)型或表達(dá)式是使用替換參數(shù)編寫(xiě)的格式或表達(dá)式。[注意:訪問(wèn)檢查是替代過(guò)程的一部分?!?—注釋[end note] 只有在函數(shù)類(lèi)型及其模板參數(shù)類(lèi)型的直接上下文中無(wú)效的類(lèi)型和表達(dá)式才可能導(dǎo)致推論失敗。[...]在整個(gè)C ++ 11標(biāo)準(zhǔn)中,“ 即時(shí)上下文 ”一詞僅出現(xiàn)8次,并且每次其后跟隨(或作為其一部分)以下(非規(guī)范)文本的實(shí)例:[注:對(duì)替換類(lèi)型和表達(dá)式的求值可能會(huì)導(dǎo)致副作用,例如實(shí)例化類(lèi)模板專(zhuān)業(yè)化和/或函數(shù)模板專(zhuān)業(yè)化,生成隱式定義的函數(shù)等。此類(lèi)副作用不在“立即”中。上下文”,并可能導(dǎo)致程序格式錯(cuò)誤?!沧該注釋對(duì)即時(shí)上下文的含義給出了(不是很慷慨的)提示,但至少對(duì)我而言,這通常不足以確定獨(dú)占是否會(huì)導(dǎo)致“硬”編譯錯(cuò)誤。題:您能否提供說(shuō)明,決策過(guò)程和/或一些具體示例,以幫助弄清楚在什么情況下函數(shù)類(lèi)型及其模板參數(shù)類(lèi)型的“ 立即上下文 ”中發(fā)生或不發(fā)生替代錯(cuò)誤?
查看完整描述

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);}

現(xiàn)場(chǎng)版。


查看完整回答
反對(duì) 回復(fù) 2019-09-26
?
哈士奇WWW

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ì)幫助您!


查看完整回答
反對(duì) 回復(fù) 2019-09-26
  • 2 回答
  • 0 關(guān)注
  • 713 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)