2013-01-10 31 views
25

我目前正在用constexpr構造函數創建一個類,我想知道是否可以使用std::array來存儲此類的數據。標準是否明確指定std::array有一個constexpr構造函數,並且它的內容可以在編譯時被訪問?可以在一個constexpr類中使用std :: array嗎?

+0

'std :: array'沒有一個'constexpr'構造函數,就我所知儘可能 –

+10

'std :: array'沒有(用戶定義的)構造函數。這是一個聚合。 – chris

+1

請注意,雖然您可以存儲數據,但您將難以用constexpr方式提取數據。 –

回答

21

因爲std::array<T, N>是集料,它可以被初始化爲constexpr當且僅當基礎類型T具有constexpr構造(當與每次提供初始化提交)。

7

基於由@MarkGlisse註釋:本compiles

#include <array> 
#include <iostream> 

template<typename T, std::size_t N> 
struct X 
{ 
    constexpr X(const std::array<T,N>& a):arr(a){} 

    private: 
    std::array<T,N> arr; 
}; 

constexpr std::array<int,2> a {{ 13, 18 }}; 
constexpr X<int,2> x = a; 

int main() 
{   
} 

我相信我已經找到了從這裏的標準的相關報價:

12.1構造函數[class.ctor]

6默認的默認構造函數是默認的,並且未定義爲已刪除,當它是od時隱式定義的爲 破壞(3.2)以創建其類型爲(012)的對象,或者在其聲明的第一個 聲明後明確默認。隱式定義的默認構造函數執行該類的初始化集 用戶編寫的默認構造函數,該類沒有 ctor-initializer(12.6.2)和一個空的複合語句。如果用戶編寫的默認構造函數 不合格,則該程序爲 不合格。如果用戶編寫的默認構造函數滿足constexpr構造函數的要求(7.1.5),則隱式定義的默認構造函數爲constexpr。

這看起來基本上就像@ BenVoigt的答案。

+0

'的#include 的#include 模板 結構X { constexpr X(標準::陣列&A):ARR(一){} 私人: STD: :array arr; }; std :: array a = {13,18}; X x = a;'爲我編譯... –

+0

@MarcGlisse嘗試在'a'和'X'前添加'constexpr',它不會編譯! – TemplateRex

+0

'的#include 的#include 模板 結構X { constexpr X(常量性病::陣列&A):ARR(一){} 私人: std :: array arr; }; constexpr std :: array a = {13,18}; constexpr X x = a;' 編譯就好了。 –

相關問題