https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113060

--- Comment #8 from Jiang An <de34 at live dot cn> ---
(In reply to Giuseppe D'Angelo from comment #7)
> Hi,
> 
> > Note that this example adds a mediate function template 
> > (test_array_element_initializable) to "reduce" the non-constexpr-ness of 
> > std::declval.
> 
> That's very clever, thank you! 
> 
> Is it _supposed_ to work, though? I had imagined (possibly erroneusly) that
> once one places the call to `test_array_element_initializable` using
> `declval` as an argument, it would disqualify the whole thing from being
> usable in constant expressions.
> 
> (It would help to have another compiler that implements P2280, so to do more
> tests...)

I think it's supposed to work. Enclosing std::declval calls don't matter
because only the constantness in the trailing return type would affect overload
resolution.

Ah, we don't even need to call the function template or function pointers -
it's sufficient to only detect the well-formedness of the function type.

The simplest "fix" I found is changing
`void_t<decltype(_Arr<_Ti>{{std::declval<_Tp>()}})>`
to
`void_t<auto (_Tp&& __t) -> decltype(_Arr<_Ti>{{std::forward<_Tp>(__t)}})>`
, which seemingly works (https://godbolt.org/z/8M85zre5P).

Reply via email to