class C
{
public:
C() : arr({1,2,3}) //doesn't compile
{}
/*
C() : arr{1,2,3} //doesn't compile either
{}
*/
private:
int arr[3];
};
I believe the reason is that arrays can be initialized only with =
syntax, that is:
int arr[3] = {1,3,4};
Questions
- How can I do what I want to do (that is, initialize an array in a constructor (not assigning elements in the body)). Is it even possible?
- Does the C++03 standard say anything special about initializing aggregates (including arrays) in ctor initializers? Or the invalidness of the above code is a corollary of some other rules?
- Do C++0x initializer lists solve the problem?
P.S. Please do not mention vectors, boost::arrays, and their superiority to arrays, which I am well aware of.
You want to init an array of ints in your constructor? Point it to a static array.
C++98 doesn't provide a direct syntax for anything but zeroing (or for non-POD elements, value-initializing) the array. For that you just write
C(): arr() {}
.I thing Roger Pate is wrong about the alleged limitations of C++0x aggregate initialization, but I'm too lazy to look it up or check it out, and it doesn't matter, does it? EDIT: Roger was talking about "C++03", I misread it as "C++0x". Sorry, Roger. ☺
A C++98 workaround for your current code is to wrap the array in a
struct
and initialize it from a static constant of that type. The data has to reside somewhere anyway. Off the cuff it can look like this:How about
?
Compiles fine on g++ 4.8
Yes. It's using a struct that contains an array. You say you already know about that, but then I don't understand the question. That way, you do initialize an array in the constructor, without assignments in the body. This is what
boost::array
does.A mem-initializer uses direct initialization. And the rules of clause 8 forbid this kind of thing. I'm not exactly sure about the following case, but some compilers do allow it.
See this GCC PR for further details.
Yes, they do. However your syntax is invalid, I think. You have to use braces directly to fire off list initialization
Workaround:
In C++03, aggregate initialization only applies with syntax similar as below, which must be a separate statement and doesn't fit in a ctor initializer.