我有一個類的接口靜態成員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;
拒絕有沒有解決辦法?還是解決方法?
感謝指針,這確實非常接近我的問題。我對你的解決方案有疑問:是否確保數組確實在編譯時計算並且只存儲一次?這裏的目標是擁有某種多重單例類,其中的一切都是靜態計算的。 – hivert
它應該做你所要求的,但恐怕我目前沒有辦法去證明它。我的編譯器不支持'constexpr',並且很難驗證,因爲你不能向constexpr-Constructor添加任何信息語句或者使用地址做技巧。但是,即使編譯器創建了多個實例,它也不應該影響運行時性能。由於它是在編譯時計算的,因此得到的數組應該是相同的。 – Excelcius
實際上它不能解決問題。我真的想擁有一個獨特的數組來確保引用的一致性。如果我做了一個static_assert(&Bar :: get_A()==&Bar :: get_A(),「Duplicate」);'然後我得到警告:Bar :: get_A()'返回一個臨時數組,並且斷言失敗。 – hivert