This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: tr1::array initialization



On May 6, 2008, at 9:19 AM, Benjamin Kosnik wrote:



I've searched this list as well as google and the c++ committee
information I've found on gcc.gnu.org and haven't seen any discussion
about this nice-to-have initialization of tr1::array:

tr1::array<int> a = { 1, 4, 6 }; // instead of tr1::array<int,N> a =
{...}

I was disappointed when I first learned of the tr1::array because I
was sure that an initializer would be allowed similar to

int a[] = {1, 4, 6};

Why can't we let the compiler figure out the N?

Such an initializer would help in auto-generated code when N is not
known in advance.

I think you made a pretty strong case here. You'd probably be best off to write up a specific proposal with the wording you desire for a variadic N, and submit it to the LWG issues list.

This is a language issue, not a library issue. Tom wants the N deduced from the initializer, but doing so would require tr1::array to be recognized by the compiler as magic; at least, I can't think of any extension that makes this not magic. Here's an alternative formulation that does work:


Add a make_array function that builds an array from the arguments it receives, e.g.,

template<typename T, typename... Args>
inline array<T, sizeof...(Args)> make_array(Args&&... args) {
return { std::forward<Args>(args)... } ; // assumes we have generalized initializer lists in C++0x!
}


Then, the way to build an array from a list of unknown size is:

auto a = make_array<T>(1, 4, 6);

- Doug


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]