Boost logo

Boost :

Subject: Re: [boost] [preprocessor] Warning: Incoming
From: Paul Mensonides (pmenso57_at_[hidden])
Date: 2011-07-01 19:55:59


On Sat, 02 Jul 2011 01:07:04 +0200, Mathias Gaunard wrote:

> On 07/02/2011 12:44 AM, Paul Mensonides wrote:
>> (I
>> do believe, however, that std::initializer_list<T> is a misfeature. I
>> personally think the { a, b, c } should have been mapped onto a
>> constructor call taking a, b, and c--which may or may not use variadic
>> templates).
>
> Both are possible in C++0x.
> That's how you initialize tuples.

The { a, b, c } syntax does not map onto constructors. It maps onto
std::initializer_list<T> for some particular (and unique) T. With C++0x,

T x { U(), U(), U() }; // or whatever the exact syntax is

maps onto a constructor T(std::initializer_list<U>). (I haven't played
around with the details enough to remember off hand the exact semantics,
so bear that in mind.) However,

T x { U(), V(), W() };

typically maps onto epic fail.

IMHO, std::initializer_list<T> should not exist as a language level
type. Variadic templates are enough provided the language maps the above
syntax directly to a constructor invocation. E.g.

T x { a, b, c }

mapping to T(a, b, c).

With that, you could have done everything that std::initializer_list<T>
could do and much more. (E.g. initialize a tuple containing values of
differing types.) You could even have added tools at the library level
to make it easier to write the constructors for non-expert users.

Given that, C's designated initializers (et al) could have been added to C
++ as a special case of keyword arguments which, in turn, could have been
extended to regular functions, not just constructors.

Regards,
Paul Mensonides


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk