[cfe-dev] [bug?] list-initialization failures in a return statement
Jim Porter
jvp4846 at g.rit.edu
Thu Aug 21 20:00:08 PDT 2014
On 8/21/2014 8:47 PM, Richard Smith wrote:
> If you'll excuse me making up terms, DefaultConstructible only requires
> that direct-default-initialization is valid, not that
> copy-default-list-initialization is valid. That's probably the bug in
> the standard; your type should probably not be considered to be
> DefaultConstructible.
>
> Here's a dumb workaround:
>
> template<typename T> struct DirectInit {
> T value{};
> operator T&() & { return value; }
> operator T&&() && { return value; }
> // ...
> };
> template<typename T> DirectInit<T> make() { return {}; }
>
> ... but I'm somewhat wondering why you would have an explicit default
> constructor in the first place.
Well, in practice, *I'd* never want it, but I was trying to be as
generic as possible, since this is part of a factory function for a test
framework, and I'm not in control of the types in question.
Really, this is more of a curiosity for me at the moment, since I'm ok
with saying "objects with explicit default-ctors can't be used as a test
fixture" (and if I ever change my mind, I can easily write a
specialization of the relevant code to avoid this). Still, it's a bit
disheartening that the standard still has this edge-case in what I'd
argue is a part of "perfect forwarding".
I'll write up a message about this and post it to the ISO discussion
group just for the sake of completeness. Maybe it'll turn out to be an
issue someone else has an interest in, but if not, I'm not terribly upset.
Anyway, thanks for the references to the relevant part of the standard.
- Jim
More information about the cfe-dev
mailing list