簡體   English   中英

超出范圍模板參數的預期行為?

[英]Expected behavior on out-of-range template parameters?

template<bool b = 2> void foo(void) {}
template void foo();

template<unsigned char n = 258> void bar(void) {}
template void bar();

GCC實例化foo <true>和bar <2>; Clang拒絕兩個“錯誤:非類型模板參數求值為2,不能縮小到'bool'類型[-Wc ++ 11-narrowing]”。

以上代碼有效嗎? 這是其中一個的錯誤嗎?

使用的版本:Clang 3.8.0-2ubuntu4,GCC 5.4.0 20160609(Ubuntu 5.4.0-6ubuntu1~16.04.2)

這是gcc bug 5789160715

來自[temp.arg.nontype]:

非類型模板參數的模板參數應該是模板參數類型的轉換常量表達式(5.20)。

來自[expr.const]:

T類型的轉換常量表達式是一個表達式,隱式轉換為T類型,其中轉換后的表達式是常量表達式,隱式轉換序列僅包含除了縮小轉換之外的[...]整數轉換(4.7)(8.5.4) )

來自[dcl.init.list]:

縮小轉換是從整數類型或無范圍枚舉類型到整數類型的隱式轉換,它不能表示原始類型的所有值,除非源是一個常量表達式,其積分促銷后的值將適合進入目標類型。

對於模板非類型參數,縮小轉換(例如2bool258char )是不正確的。

暫無
暫無

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

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