<br><br><div class="gmail_quote">On Wed, Jun 20, 2012 at 12:53 AM, Richard Smith <span dir="ltr"><<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="HOEnZb"><div class="h5">On Tue, Jun 19, 2012 at 3:17 PM, Sebastian Redl<br>
<<a href="mailto:sebastian.redl@getdesigned.at">sebastian.redl@getdesigned.at</a>> wrote:<br>
><br>
> On 19.06.2012, at 18:49, Chandler Carruth wrote:<br>
><br>
> On Tue, Jun 19, 2012 at 1:20 AM, Jay Foad <<a href="mailto:jay.foad@gmail.com">jay.foad@gmail.com</a>> wrote:<br>
>><br>
>> Hi,<br>
>><br>
>> I'd really like to be able to get a warning when "almost all" elements<br>
>> of an array are initialised:<br>
>><br>
>>  #define N 8<br>
>>  const int a[N] = { 3, 1, 4, 1, 5, 9, 2 };<br>
>>  warning: some but not all array elements initialised<br>
><br>
><br>
> At least in C++, this warning wouldn't make a lot of sense because all of<br>
> the array elements *are* initialized. [dcl.init.aggr] 8.5.1/7: "If there are<br>
> fewer initializers in the list than there are members in the aggregate, then<br>
> each member not explicitly initialized shall be value-initialized (8.5)."<br>
><br>
> We would have a problem with lots of code which intended to initialized the<br>
> first few elements, and zero out the rest.<br>
><br>
> Maybe someone has clever ideas about how to syntactically differentiate<br>
> between these two use cases?<br>
><br>
><br>
> const int a[] = { 3, 1, 4, 1, 5, 9, 2 };<br>
> static_assert(arraysize(a) == N, "N was increased, you need more<br>
> initializers");<br>
<br>
</div></div>Ooh, can I play?<br>
<br>
// In a library...<br>
struct end_t {} constexpr end {};<br>
template<typename T> struct WithEnd { T a; end_t end; };<br>
<br>
// error, no conversion from end_t to int<br>
WithEnd<const int[N]> a = { 3, 1, 4, 1, 5, 9, 2, end };<br>
<br>
... or ...<br>
<br>
// In a library...<br>
template<typename T, size_t...Ns> struct ArrImpl {<br>
  constexpr ArrImpl(const decltype(Ns, declval<T>()) &...arg) : arr{arg...} {}<br>
  T arr[sizeof...(Ns)];<br>
};<br>
template<typename T> struct ArrBuilder;<br>
template<typename T, size_t N> struct ArrBuilder<T[N]> {<br>
  typedef typename ArrBuilder<ArrImpl<T,N-1>>::type type;<br>
};<br>
template<typename T, size_t ...Ns> struct ArrBuilder<ArrImpl<T, 0, Ns...>> {<br>
  typedef ArrImpl<T, 0, Ns...> type;<br>
};<br>
template<typename T, size_t N, size_t ...Ns> struct<br>
ArrBuilder<ArrImpl<T, N, Ns...>> {<br>
  typedef typename ArrBuilder<ArrImpl<T, N-1, N, Ns...>>::type type;<br>
};<br>
template<typename T> using Arr = typename ArrBuilder<T>::type;<br>
<br>
// error, no matching constructor<br>
Arr<const int[8]> a = { 1, 2, 3, 4, 5, 6, 7 };<br>
<div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
</div></div></blockquote></div><br><br>I think Sebastian got the easiest alternative!<br><br>-- Matthieu<br>