簡體   English   中英

是否縮小了需要診斷的非類型模板參數的轉換?

[英]Are narrowing conversions in non-type template parameters required to be diagnosed?

這幾乎肯定是重復的是gcc錯誤沒有診斷縮小非類型模板參數中的轉換? 但它沒有提供令人滿意的答案。 答案並未解決海灣合作委員會是否在提供診斷方面出錯,只是給出一個有點替代的警告標志。

標准的相關部分:

§14.3.2/ 5

對於整數或枚舉類型的非類型模板參數,將應用轉換常量表達式(5.19)中允許的轉換。

§5.19/ 3

T類型的轉換常量表達式是一個文字常量表達式,隱式轉換為類型T,其中隱式轉換(如果有)在文字常量表達式中是允許的,而隱式轉換序列僅包含用戶定義的轉換,lvalue-to-除縮小轉化次數之外的右值轉換(4.1),整數促銷(4.5)和積分轉換(4.7)(8.5.4)

該標准解決了縮小轉換會使程序格式錯誤的情況,但這里有一個明顯的遺漏,因此編譯器不同意(GCC沒有提供診斷,Clang使這個錯誤,MSVC也沒有提供診斷。)是否有語言對於這種情況說的標准,需要診斷(即它是不正確的)?

#include <array>

int main()
{
    std::array<int, -1> a;
}

截至n3337,措辭已經改變,以表明結果是不正確的。 (§14.3.2/ 5):

對用作非類型模板參數的每個表達式執行以下轉換。 如果非類型模板參數無法轉換為相應模板參數的類型,則程序格式錯誤。

由於它規定程序格式錯誤,並且沒有給予相反的特定許可,因此違反此規定需要進行診斷(根據§1.4/ 1):

可診斷規則集包含本國際標准中的所有語法規則和語義規則,但那些包含“無需診斷”的明確表示法或被描述為導致“未定義行為”的規則除外。

FWIW,請注意他們也將允許的轉換的定義與轉換的常量表達式的定義分開 - 可能的轉換現在直接列在§14.3.2/ 5中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM