В настоящее время я создаю класс с конструктором constexpr
, и мне интересно, могу ли я использовать std::array
для хранения данных этого класса. Является ли стандарт явно указывать, что std::array
имеет конструктор constexpr
и что его содержимое можно получить во время компиляции?
Может ли std:: array использоваться в классе constexpr?
Ответ 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.