2014-03-05 38 views
12

考慮下面的代碼:非終止constexpr函數是否定義良好?

constexpr unsigned f(unsigned x) 
{ 
    while (x & 1) x *= 3; 
    return x; 
} 

int main() 
{ 
    char a[f(2)]; 
    char b[f(1)]; 
} 

如果不是很明顯:對奇數x,功能f永遠不會終止。

當我編譯上面的程序with clang on colirub似乎是一個VLA,但不a

warning: variable length arrays are a C99 feature [-Wvla-extension] 

char b[f(1)]; 

有沒有在該編譯器決定停止常量表達式的評價一個明確的限制嗎?或者,如果一個符合標準的編譯器進入一個無限循環,它會非常好嗎? f(1)產量UB?

+1

替代標題:「是否constexpr解決暫停問題?」 (當然是在開玩笑) – stefan

回答

7

有許多事情,這意味着一個表達式是 不是芯常量表達式

- 一個constexpr函數的調用或一個constexpr構造函數,將超過實現定義遞歸極限;

(§5.19/第5點)。所以限制是定義的實現 。

+4

原來,C++ 14已經將它改變爲「超出實現定義的限制的表達式」,以涵蓋非遞歸限制,在這種情況下,「在一個核心常量表達式「 –

+0

參見附錄B:」在覈心常量表達式[1 048 576]內評估完整表達式「。 –

+0

@ JohannesSchaub-litb是的。我開始尋找,然後失去原始表達的軌跡。這是一個很好的問題:必須有一些限制,否則編譯器將永遠不會停止。 –

相關問題