Подтвердить что ты не робот

Может ли std:: array использоваться в классе constexpr?

В настоящее время я создаю класс с конструктором constexpr, и мне интересно, могу ли я использовать std::array для хранения данных этого класса. Является ли стандарт явно указывать, что std::array имеет конструктор constexpr и что его содержимое можно получить во время компиляции?

4b9b3361

Ответ 1

Поскольку std::array<T, N> является агрегатом, его можно инициализировать как constexpr тогда и только тогда, когда базовый тип T имеет конструктор constexpr (если представлен каждый инициализатор, который вы предоставляете).

Ответ 2

На основе комментария @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 По умолчанию конструктор по умолчанию и не определен как удаленный неявно определяемый, когда он одуван (3.2), чтобы создать объект его тип класса (1.8) или когда он явно дефолт после его первого декларация. Неявно установленный конструктор по умолчанию выполняет набор инициализаций класса, который будет выполняться с помощью пользовательский конструктор по умолчанию для этого класса без ctor-initializer (12.6.2) и пустой составной оператор. Если это пользовательский конструктор по умолчанию будет плохо сформирован, программа плохо сформирован. Если этот пользовательский конструктор по умолчанию будет удовлетворять требования конструктора constexpr (7.1.5), неявно определяемые конструктор по умолчанию - constexpr.

Это выглядит по существу как ответ @BenVoigt.