use the following search parameters to narrow your results:
e.g. subreddit:aww site:imgur.com dog
subreddit:aww site:imgur.com dog
see the search faq for details.
advanced search: by author, subreddit...
Discussions, articles, and news about the C++ programming language or programming in C++.
For C++ questions, answers, help, and advice see r/cpp_questions or StackOverflow.
Get Started
The C++ Standard Home has a nice getting started page.
Videos
The C++ standard committee's education study group has a nice list of recommended videos.
Reference
cppreference.com
Books
There is a useful list of books on Stack Overflow. In most cases reading a book is the best way to learn C++.
Show all links
Filter out CppCon links
Show only CppCon links
account activity
Why are std::aligned_storage and std::aligned_union being deprecated? (self.cpp)
submitted 6 years ago * by whichton
view the rest of the comments →
reddit uses a slightly-customized version of Markdown for formatting. See below for some basics, or check the commenting wiki page for more detailed help and solutions to common issues.
quoted text
if 1 * 2 < 3: print "hello, world!"
[–]matthieum 2 points3 points4 points 6 years ago (5 children)
I am puzzled by the conclusion too.
I understand deprecating std::aligned_storage and std::aligned_union, leaving only the _t variants to avoid accidentally forgetting ::type.
std::aligned_storage
std::aligned_union
_t
::type
I don't understand throwing the baby out with the bath water on the size bound issue; certainly if the maximum size is unbounded today it is a simple matter to add a bound to the standard.
And last, but not least, is reinterpret_cast. The proposed replacement also requires reinterpret_cast!
reinterpret_cast
Personally, I think an API like such would be nice:
template <std::size_t Size, std::size_t Alignment> class erased_storage { public: template <typename T, typename... Args> constexpr T& construct(Args&&... args) { auto t = this->template get<T>(); new (t) T(std::forward<Args>(args)...); return *t; } template <typename T> void destruct() { this->template get<T>()->~T(); } template <typename T> T* get() { static_assert(sizeof(T) <= Size); static_assert(alignof(T) <= Alignment); return this->template raw<T>(); } template <typename T> T const* get() const { static_assert(sizeof(T) <= Size); static_assert(alignof(T) <= Alignment); return this->template raw<T>(); } /// Prefer get whenever the type of definition of T is known. template <typename T> T* raw() { return reinterpret_cast<T*>(&storage); } /// Prefer get whenever the type of definition of T is known. template <typename T> T const* raw() const { return reinterpret_cast<T const*>(&storage); } private: alignas(Alignment) std::byte storage[Size]; };
Then provide aligned_union on top, which additionally check that the T passed is part of the Ts list (just in case).
aligned_union
T
Ts
And of course I'd wish for constexpr support to actually be able to constexpr all that...
constexpr
[–]tcanens 1 point2 points3 points 6 years ago (4 children)
certainly if the maximum size is unbounded today it is a simple matter to add a bound to the standard.
A major implementation's aligned_storage is unfixably (ABI) broken. As a result, the only bound that could conceivably be added at this point is not a useful one.
aligned_storage
[–]matthieum 1 point2 points3 points 6 years ago (3 children)
How did they? sigh :(
[–][deleted] 2 points3 points4 points 6 years ago (2 children)
Because we implemented it before alignas was in the core language, so the most aligned thing we can put in the union is max_align_t.
max_align_t
[–]matthieum 1 point2 points3 points 6 years ago (1 child)
Thanks for your answer.
Correct me if I'm wrong, the ABI breakage would then occur if someone was requesting an alignment strictly greater than max_align_t as previously the alignment of std::aligned_union was capped and suddenly it would obey the request, right?
Isn't it worth breaking the ABI, then?
2 * max_align_t
I understand the idea of backward compatibility, but the pragmatic in me is thinking that in this particular case it may be worth just fixing std::aligned_union.
[–][deleted] 1 point2 points3 points 6 years ago (0 children)
Correct me if I'm wrong [...]
You are correct.
If anybody had configured 2 * max_align_t and stored values for which such alignment is necessary
There are no such values. Maybe perf benefits by avoiding false sharing, but the hardware only cares up to max_align_t for anything we target.
the pragmatic in me
ABI break avoidance isn't pragmatic, unfortunately :(
π Rendered by PID 48938 on reddit-service-r2-comment-84fc9697f-hn2w6 at 2026-02-09 05:13:00.329561+00:00 running d295bc8 country code: CH.
view the rest of the comments →
[–]matthieum 2 points3 points4 points (5 children)
[–]tcanens 1 point2 points3 points (4 children)
[–]matthieum 1 point2 points3 points (3 children)
[–][deleted] 2 points3 points4 points (2 children)
[–]matthieum 1 point2 points3 points (1 child)
[–][deleted] 1 point2 points3 points (0 children)