2016-07-30 85 views
0

Visual Studio 2015更新3.爲什麼我不能遞增簡單constexpr函數的參數?

我讀了編程。使用C++的原理和實踐(第二版)作者:Bjarne Stroustrup。我學習constexpr功能...

它的工作原理:

constexpr int get_value(int n) { 
    return n + 1; 
} 

但我不能編譯這個(而不是第一個變體):

constexpr int get_value(int n) { 
    return ++n; 
} 

我得到的錯誤:

constexpr function return is non-constant

n本地變量爲get_value函數。即n變量不會影響外部代碼。

爲什麼get_value函數的第二個變體是錯誤的?

+2

嘗試一個合適的編譯器。 – Columbo

+0

我用'g ++ 5.3.1'在'codeblock'中引用並啓動。 –

+0

@ k-five,嗯...也許我的問題是特定於IDE,我使用... –

回答

3

第二個不允許在C++ 11 constexpr。標準甚至有一個非常類似的例子(N3337 [dcl.constexpr]/3):在常量表達式

constexpr int prev(int x) 
{ return --x; } // error: use of decrement 

N3337 [expr.const]/2明確地禁止 「遞增或遞減操作」。

C++ 14擴展constexpr放寬了這些要求,但MSVC並未實現該要求。

+0

嗯......爲什麼被禁止?它有什麼危險? –

+0

@AndreyBushman:沒有危險,只是規格純度:_不允許突變。這個限制在C++ 14中消失了,因爲它允許一般的變異,這不僅僅是因爲增量和減量操作不再單獨出現。 – ildjarn

2

第二個在C++ 14下是合法的,但它不能編譯,因爲Visual Studio 2015只支持部分constexpr函數。它只支持單返回constexpr函數和其他限制(如你的),這在C++ 11中有效。

請參閱this文章(在constexpr段落中)。 Visual Studio「15」將爲constexpr功能帶來改進。你必須等一下:)

相關問題