Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can std::array be used in a constexpr class?

I am currently creating a class with a constexpr constructor and I wonder if I can use an std::array to store the data of this class. Does the standard explicitly specify that an std::array has a constexpr constructor and that its contents can be accessed at compile-time ?

like image 397
Vincent Avatar asked Jan 10 '13 21:01

Vincent


People also ask

Can std:: array be constexpr?

Since C++17 std::array can be declared as constexpr: constexpr std::array myArray{1, 2, 3}. Now starts the fun part. With C++20, you can use a std::array at compile-time. The std::array (1) and all results of the calculations are declared as constexpr .

What is constexpr in C ++ 11?

The keyword constexpr was introduced in C++11 and improved in C++14. It means constant expression. Like const , it can be applied to variables: A compiler error is raised when any code attempts to modify the value. Unlike const , constexpr can also be applied to functions and class constructors.


2 Answers

Because std::array<T, N> is an aggregate, it can be initialized as a constexpr if and only if the underlying type T has a constexpr constructor (when presented with each initializer you provide).

like image 112
Ben Voigt Avatar answered Oct 02 '22 14:10

Ben Voigt


Based on the comment by @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() 
{        
}

I believe I have found the relevant quote from the Standard here:

12.1 Constructors [class.ctor]

6 A default constructor that is defaulted and not defined as deleted is implicitly defined when it is odrused (3.2) to create an object of its class type (1.8) or when it is explicitly defaulted after its first declaration. The implicitly-defined default constructor performs the set of initializations of the class that would be performed by a user-written default constructor for that class with no ctor-initializer (12.6.2) and an empty compound-statement. If that user-written default constructor would be ill-formed, the program is ill-formed. If that user-written default constructor would satisfy the requirements of a constexpr constructor (7.1.5), the implicitly-defined default constructor is constexpr.

This looks essentially like @BenVoigt's answer.

like image 30
TemplateRex Avatar answered Oct 05 '22 14:10

TemplateRex