亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

static_assert取決于非類型模板參數(gcc和clang的不同行為)

static_assert取決于非類型模板參數(gcc和clang的不同行為)

C++
慕俠2389804 2019-11-20 09:35:56
template <int answer> struct Hitchhiker {  static_assert(sizeof(answer) != sizeof(answer), "Invalid answer");};template <> struct Hitchhiker<42> {};在嘗試使用禁用常規模板實例化時,static_assert我發現clang即使在未實例化模板時,上述代碼也會產生斷言錯誤,而gcc僅在Hitchhiker使用以外的參數實例化時,才會生成斷言錯誤42。擺弄我發現這個斷言:template <int answer> struct Hitchhiker {  static_assert(sizeof(int[answer]) != sizeof(int[answer]), "Invalid answer");};template <> struct Hitchhiker<42> {};在兩個編譯器上的行為相同:斷言僅在實例化常規模板時才起作用。標準說什么,哪個編譯器正確?g++ 4.9.2clang++ 3.50
查看完整描述

3 回答

?
浮云間

TA貢獻1829條經驗 獲得超4個贊

如果由于不依賴于模板參數的構造而導致模板定義后的假想實例化格式不正確,則程序格式不正確;無需診斷。


N4296 [溫度] / 8


這在定義了主模板(其中有一個static_assert)之后立即適用。因此,以后的專業化(for 42)尚不存在,因此無法考慮。


接下來的問題是,如果static_assert( sizeof(answer) != sizeof(answer), 依賴于answer。在語義上沒有,在語法上沒有,并且在標準方面:


在模板內部,某些構造的語義可能因一個實例而異。這樣的構造取決于模板參數。


N4296 [溫度深度] / 1


構造sizeof(answer) != sizeof(answer)從一個實例到另一個實例沒有不同。因此,這種構造不依賴于模板參數。這意味著整個過程static_assert不取決于template參數。


因此,您的程序格式錯誤,不需要診斷。發出任意診斷(例如static_assert失?。┦怯行У木幾g器行為。缺少問題是有效的編譯器行為。由標準格式未定義的,由錯誤格式編譯的程序的行為:未定義的行為。允許鼻惡魔。


花哨的嘗試(例如sizeof(int[answer])!=sizeof(int[answer])可能會喜歡當前的上帝編譯器,但不會使您的程序格式更好。


您可能會遇到這樣的情況,即編譯器不太可能抓住您,但是不管編譯器是否能夠抓住您,它的格式仍然不正確。通常,C ++希望保留自身(及其編譯器)的自由,以“早于實例化”來查找無效的模板代碼。這意味著模板代碼必須產生可能的合法代碼。


您可能想要=delete帶有附加消息的內容。


查看完整回答
反對 回復 2019-11-20
?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

兩種編譯器都是正確的。從[temp.res] / 8:


如果無法為模板生成有效的專業化名稱,并且該模板未實例化,則該模板格式錯誤,無需診斷。


沒有可以從主模板生成的有效專業化名稱Hitchhiker,因此它格式不正確,不需要診斷。clang選擇仍然發出診斷。


如果您只想允許42,則只需不定義常規模板:


template <int > struct Hitchhiker;

template <> struct Hitchhiker<42> {};


查看完整回答
反對 回復 2019-11-20
?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

我不同意您對[temp.dep] / 1的解釋:我認為May 可以作為編譯器的余地,以避免實際嘗試構造一個實例或另一個實例中是否確實具有不同語義的問題,并且相反,讓編譯器決定是否有可能具有不同的語義(它提到模板參數),則將其視為“ depends”。我認為,這條路非常重要,因為表達式可以任意卷積,從而確定實例化是否可能是復雜的。

查看完整回答
反對 回復 2019-11-20
  • 3 回答
  • 0 關注
  • 668 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號