From: Andrey Semashev via Boost Sent: Mittwoch, 12. Juli 2017 13:22
I agree that such a macro would be useful in Boost.Config as I know this attribute is used in multiple places in Boost. I'll prepare a PR.
Cool, thanks :)
I still think that some "nicer" way of doing this would be cool. And the more I think about it, the more I'm liking the "aliasing_barrier()" idea. Hmm...
I don't think this approach is the way to go. First, because it would be complicated to use. You would have to guard _every_ context where the aliasing pointer is dereferenced with a pair of barriers, and in some contexts it is difficult to do (think operator -> or passing the pointed value as a function argument). Besides, it's just too easy to miss a place where the barrier is needed.
Hm. Maybe you're right. Have to think about this some more.
I think the attribute is the closest we can get. We could also provide a helper like this:
template< typename T > T BOOST_MAY_ALIAS* alias(T*);
Although the caller still needs to know the type T BOOST_MAY_ALIAS* (unless he can use auto for that), so I'm not sure how useful that would be.
It could also be used like this: T* ptr... for (...) { T value = *alias(ptr); ptr++; } Another possibility would be something like template <class T> T aliasing_read(void* address) {...} template <class T> void aliasing_write(void* address, prevent_deduction<T>::type value) {...} Which is what we use in our code. (I had to try very hard to resist the urge to simply call those "peek" and "poke".)