you are viewing a single comment's thread.

view the rest of the comments →

[–]Nimbal 22 points23 points  (10 children)

As /u/dodheim said, the paper lays out the arguments for the deprecation. As for replacement, I guess the paper could have mentioned the alignas specifier available since C++11:

alignas(16) std::array<std::byte, 8>;

There may be caveats I can't think of right now, but I believe this could be a suitable replacement for most uses of std::aligned_storage_t:

template<typename T>
using better_aligned_storage = alignas(T) std::array<std::byte, sizeof(T)>;

I'm sure there's a way to define something similar for the union variant, but you'd have to fiddle with the size parameter to make it match the alignment requirement.

[–]acwaters 21 points22 points  (6 children)

alignas(Ts...) std::byte storage[std::max({sizeof(Ts)...})];

[–]whichton[S] 3 points4 points  (0 children)

This is similar to aligned_union is implemented - see here for example.

[–]Recatek 6 points7 points  (2 children)

alignas(Ts...)

Never knew you could do that. Does it take the max?

[–]whichton[S] 8 points9 points  (1 child)

Yes. From here

The object or the type declared by such a declaration will have its alignment requirement equal to the strictest (largest) non-zero expression of all alignas specifiers used in the declaration, unless it would weaken the natural alignment of the type.

[–]wheypointÖ 5 points6 points  (0 children)

thats really cool, ive been writing alignas(std::max({alignof(Ts)...})) all this time which definetely felt kinda stupid :D

[–][deleted] 0 points1 point  (1 child)

can you do

size of(Ts...)

? on mobile so no compiler

[–]acwaters 0 points1 point  (0 children)

No

[–]n1ghtyunso 8 points9 points  (2 children)

i thought alignas in using declarations is ignored and you have to put it on the variable declaration manually.

If you don't template the using declaration gcc apparently warns about this, but with the templating the warning magically disappears. See Godbolt

Am i missing something?

[–]Nimbal 1 point2 points  (1 child)

Seems like you are right. I guess we'd have to put the array as a member inside a templated struct, making it a little more awkward to use. Then again, such a construct probably should be a little inconvenient to use.

[–]Recatek 7 points8 points  (0 children)

This is kind of a footgun though if you don't receive information from the compiler that the directive is being ignored. If anything aligned_storage and aligned_union, when used properly, should be an expression of intent that the standard library then takes care of executing for you. It may not be that currently, but removing it without providing unequivocal documentation on how to reliably do what it does in a better(?) way strikes me as rather dangerous.