web-dev-qa-db-ja.com

std :: arrayはconstexprクラスで使用できますか?

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

31
Vincent

std::array<T, N>は集合体であり、基礎となる型constexprTコンストラクターがある場合にのみ、constexprとして初期化できます(提供する各初期化子と共に提示される場合)。

27
Ben Voigt

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

これは基本的に@BenVoigtの回答に似ています。

9
TemplateRex