2014-03-04 48 views
2

我有一個類的接口靜態成員Bar 這是一個Bar本身的數組引導問題。請看下面的完全正確的代碼:作爲一個靜態constexpr成員的類元素數組

struct Foo { 
    int i; 
    static const std::array<Foo, 2> A; 
}; 
const std::array<Foo, 2> Foo::A {{{1},{2}}}; 

現在我想有Foo::A不僅常量也constexpr。我面臨着 的問題,即靜態constexpr成員初始化必須完成 裏面的類聲明。但是,由於聲明還沒有完成,因此編譯器不知道實例的大小,因此拒絕使用 來創建數組。例如

struct Bar { 
    int i; 
    constexpr static const std::array<Bar, 2> A{{{1},{2}}}; 
}; 

/usr/include/c++/4.8/array: In instantiation of ‘struct std::array<Bar, 2ul>’: 
ess.cpp:14:56: required from here 
/usr/include/c++/4.8/array:97:56: error: ‘std::array<_Tp, _Nm>::_M_elems’ has incomplete type 
     typename _AT_Type::_Type       _M_elems; 

拒絕有沒有解決辦法?還是解決方法?

回答

0

我已經找到了以下解決方案,確保

  1. 數組計算在編譯時
  2. 數組存儲在結構中而不被複制。

想法是在constexpr數組上使用const引用。

struct Bar { 
    int i; 
    static const std::array<Bar, 2> &A; 
}; 

constexpr const std::array<Bar, 2> BarA {{{1},{2}}}; 
const std::array<Bar, 2> &Bar::A = BarA; 
2

這是不可能的,編譯器無法預先知道constexpr是否被允許/可能。與函數替換部件A,它應該工作:

struct Bar 
{ 
    int i; 
    constexpr static std::array<Bar, 2> get_A() 
    { 
     return {{{1}, {2}}}; 
    } 
}; 

相關(幾乎重複):static constexpr member of same type as class being defined

+0

感謝指針,這確實非常接近我的問題。我對你的解決方案有疑問:是否確保數組確實在編譯時計算並且只存儲一次?這裏的目標是擁有某種多重單例類,其中的一切都是靜態計算的。 – hivert

+0

它應該做你所要求的,但恐怕我目前沒有辦法去證明它。我的編譯器不支持'constexpr',並且很難驗證,因爲你不能向constexpr-Constructor添加任何信息語句或者使用地址做技巧。但是,即使編譯器創建了多個實例,它也不應該影響運行時性能。由於它是在編譯時計算的,因此得到的數組應該是相同的。 – Excelcius

+0

實際上它不能解決問題。我真的想擁有一個獨特的數組來確保引用的一致性。如果我做了一個static_assert(&Bar :: get_A()==&Bar :: get_A(),「Duplicate」);'然後我得到警告:Bar :: get_A()'返回一個臨時數組,並且斷言失敗。 – hivert

相關問題