2017-04-21 52 views
4

允許聲明一個非const引用爲constexpr?示例代碼:constexpr對非const對象的引用

int x = 1; 
constexpr int& r = x; 

這是通過gcc和鐺接受(我試圖兩者的幾個當前和過去的版本,回到C++ 11,和所有接受了它)。然而,我認爲它不應該被接受,因爲C++ 14 [dcl.constexpr/9]表示:

如果constexpr說明符以引用聲明使用

,則出現在其初始值設定每全 表達應是一個常量表達式

x不是一個常量表達式。

[dcl.constexpr]的最新C++ 17草案中的語言發生了變化,甚至沒有提及明確引用constexpr,我無法對它們進行說明。

+1

誰說'x'不是一個常量表達式? –

+0

「'x'不是核心常量表達式」{{引用需要}} –

+0

@ T.C。 [expr.const]/2「e」是一個核心常量表達式,除非[e]的評估會評估以下值之一:左值到右值的轉換,除非它適用於[例子這個代碼不匹配]「 –

回答

4

假設x具有靜態存儲持續時間,左值表達式x是一個完全有效的常量表達式。

如果在需要prvalue,這導致左值到右值轉換爲被施加到其上的上下文中使用x,然後將所得prvalue表達 - 稱之爲TO_RVALUE(x) - 將不是一個常量表達式,由於明顯的原因。但在引用綁定的情況下,不存在這種轉換。

+0

它依賴於初始化器嗎? (例如'int x = rand();'仍然使'x'成爲一個常量表達式?) –

+0

@ M.M否(是)一個左值常量表達式僅僅指定實體(基本上,就像它的地址)。它的初始化是無關緊要的,編譯器甚至不需要知道它(例如'extern int x;'就足夠了)。 –