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帶有附加消息的內容。

TA貢獻1841條經驗 獲得超3個贊
兩種編譯器都是正確的。從[temp.res] / 8:
如果無法為模板生成有效的專業化名稱,并且該模板未實例化,則該模板格式錯誤,無需診斷。
沒有可以從主模板生成的有效專業化名稱Hitchhiker,因此它格式不正確,不需要診斷。clang選擇仍然發出診斷。
如果您只想允許42,則只需不定義常規模板:
template <int > struct Hitchhiker;
template <> struct Hitchhiker<42> {};

TA貢獻1871條經驗 獲得超13個贊
我不同意您對[temp.dep] / 1的解釋:我認為May 可以作為編譯器的余地,以避免實際嘗試構造一個實例或另一個實例中是否確實具有不同語義的問題,并且相反,讓編譯器決定是否有可能具有不同的語義(它提到模板參數),則將其視為“ depends”。我認為,這條路非常重要,因為表達式可以任意卷積,從而確定實例化是否可能是復雜的。
- 3 回答
- 0 關注
- 668 瀏覽
添加回答
舉報