2015-08-09 18 views
23

我爲什麼可以這樣做:變異一個constexpr函數內部一個int

constexpr auto i_can() { 
    int a = 8; 
    a = 9; 
    //... 
} 

但我不能這樣做:

constexpr auto i_cannot() { 
    std::array<int, 10> arr{}; 
    //I cannot 
    arr[5] = 9; 
} 

我的問題是:

  1. 如果我能發生變異一個int,爲什麼我不能改變數組內的int
  2. 這是語言限制(C++ 14)還是標準庫規格問題? reference std::array<T, N>::operator[](size_t)目前不是constexpr
+5

相關:[LWG問題2243](http://www.open-std.org/JTC1/SC22/WG21/docs/lwg-active.html#2443) – dyp

回答

16

它是標準庫的限制,因爲你可以constexpr修改普通的C數組:

#include <iostream> 

constexpr auto demo() 
{ 
    int arr[10] = {}; 
    arr[5] = 9; 
    return arr[5]; 
} 

int main() 
{ 
    static_assert(demo() == 9, ""); 
    std::cout << demo() << std::endl; 
    return 0; 
} 

DEMO

輸出

9 

一世如果您添加了constexproperator[]的執行array,您也可以在constexpr內使用此運算符。對象的內部constexpr功能

DEMO

+2

這是猜測或答案? – Shoe

+0

你的代碼並不能證明'demo'在被調用時產生一個常量表達式。你必須編寫例如'static_assert(demo()== 9,「」);'確定。 – Columbo

+0

@Columbo謝謝你的提示,我添加了'static_assert' –

17

變形已被引入用C++ 14。但是,在修改例如通過賦值標量是好的,通過成員函數修改類對象仍然需要該成員函數爲constexpr。不幸的是,正如您所提到的,目前的std::array規範並未聲明非constoperator[]constexpr
因此,§7.1.5/ 5使你的定義非法的構造:

對於非模板,非缺省constexpr函數[...],如果沒有 參數值存在,使得的調用函數 可能是一個核心常量表達式的評估子表達式 (5.20),[...],該程序是格式不正確;不需要診斷。

如果您想要完整的constexpr性,您可以暫時使用更現代的實現。例如。 Constainer::Array

+0

所以它發生的位集:( –

+2

@GermánDiago那麼,使用['Constainer :: Bitset'](https://github.com/Arcoth/Constainer/blob/master/Bitset。hxx):-P – Columbo

+2

只是一個觀察,「constainer」實際上是Columbo提到的庫的名稱,而不是拼寫錯誤。 –

相關問題