[英]Is (int&&)5 an integral constant expression?
g ++接受代碼:
char b[static_cast<int&&>(5)];
N3936 [expr.const] / 3將術語定義為:
整數常量表達式是整數或未整數枚舉類型的表達式,隱式轉換為prvalue,其中轉換后的表達式是核心常量表達式。 [注意:這樣的表達式可以用作數組邊界[...]
我不確定因為表達式看起來像int&&
但3.9中的整數類型的定義沒有提到引用類型。
如果不清楚,我的問題是: static_cast<int&&>(5)
是一個整數常量表達式嗎?
背景:問題的動機如下:
char *c = (1 - 1);
char *d = static_cast<int&&>(0);
帶有-std=c++11
所有最新版本的g++
接受c
行但拒絕d
行。 C ++ 11標准表示空指針常量是值為0
的整型常量表達式 。 (這對C ++ 14來說已經改變了)。
clang(3.4.1和更高版本)拒絕-std=c++11
模式中的c
行。
所以看來g ++中存在一個錯誤,但我想確認錯誤是在b
還是d
定義中。
據我所知, static_cast<int&&>(5)
確實是一個常量表達式,其結果是來自草案C ++ 11標准部分5.2.9
[expr.static.cast]的xvalue :
[...]如果T是對象類型的右值引用,則結果為xvalue [...]
如果我們轉到第5.19
節[expr.const],我們有:
條件表達式是核心常量表達式,除非[...]
我們有以下子彈:
- 除非適用,否則左值到右值的轉換(4.1)
除以下異常:
- 一個文字類型的glvalue,它引用一個生命周期尚未結束的非易失性臨時對象,用一個常量表達式初始化;
你還注意到:
clang(3.4.1及更高版本)錯誤地拒絕-std = c ++ 11模式中的c行。
但正如TC指出的那樣,因為這一變化是通過DR 903鏗鏘聲應用的,所以行為是有效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.