36

現在、コンストラクターを使用してクラスを作成していますが、このクラスのデータを格納するためconstexprに を使用できるかどうか疑問に思っています。標準は、 にコンストラクターがあり、その内容にコンパイル時にアクセスできることをstd::array明示的に指定していますか?std::arrayconstexpr

4

2 に答える 2

34

std::array<T, N>は集合体であるため、基になる型にコンストラクターがconstexprある場合にのみ、ifとして初期化できます (提供する各初期化子を指定した場合)。Tconstexpr

于 2013-01-10T22:21:20.333 に答える
11

@MarkGlisseによるコメントに基づく:これはコンパイルされます

#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デフォルトであり、削除済みとして定義されていないデフォルトコンストラクタは、クラスタイプ(1.8)のオブジェクトを作成するためにodrused(3.2)された場合、または最初の宣言後に明示的にデフォルトされた場合に暗黙的に定義されます。暗黙的に定義されたデフォルトコンストラクターは、ctor-initializer(12.6.2)がなく、空の複合ステートメントを使用せずに、そのクラスのユーザー作成のデフォルトコンストラクターによって実行されるクラスの初期化のセットを実行します。そのユーザー作成のデフォルトコンストラクターの形式が正しくない場合、プログラムの形式は正しくありません。そのユーザー作成のデフォルトコンストラクターがconstexprコンストラクター(7.1.5)の要件を満たす場合、暗黙的に定義されたデフォルトコンストラクターはconstexprです。

これは本質的に@BenVoigtの答えのように見えます。

于 2013-01-10T21:43:23.563 に答える