This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of Resolved status.

### 1469. `atomic<T*>` inheritance from `atomic_address` breaks type safety

Section: 33.5.8 [atomics.types.generic] Status: Resolved Submitter: BSI Opened: 2010-08-25 Last modified: 2016-01-28

Priority: Not Prioritized

View all other issues in [atomics.types.generic].

View all issues with Resolved status.

Discussion:

Addresses GB-133

The free functions that operate on `atomic_address` can be used to store a pointer to an unrelated type in an `atomic<T*>` without a cast. e.g.

>     int i;
>     atomic<int*> ai(&i);
>     string s;
>     atomic_store(&ai,&s);

Overload the `atomic_store`, `atomic_exchange` and `atomic_compare_exchange_[weak/strong]` operations for `atomic<T*>` to allow storing only pointers to `T`.

[ 2010-10-27 Daniel adds: ]

> Resolving this issue will also solve 1467

> Accepting n3164 would solve this issue by removing `atomic_address`.

[Resolved in Batavia by accepting n3193. ]

Proposed resolution:

Add the following overloads to 33.5.8 [atomics.types.generic], the synopsis around the specialization `atomic<T*>`, as indicated:

>     namespace std {
>       [..]
>       template <class T> struct atomic<T*> : atomic_address {
>         [..]
>       };

>       template<typename T>
>       void atomic_store(atomic<T*>&,T*);
>       template<typename T>
>       void atomic_store(atomic<T*>&,void*) = delete;
>       template<typename T>
>       void atomic_store_explicit(atomic<T*>&,T*,memory_order);
>       template<typename T>
>       void atomic_store_explicit(atomic<T*>&,void*,memory_order) = delete;
>       template<typename T>
>       T* atomic_exchange(atomic<T*>&,T*);
>       template<typename T>
>       T* atomic_exchange(atomic<T*>&,void*) = delete;
>       template<typename T>
>       T* atomic_exchange_explicit(atomic<T*>&,T*,memory_order);
>       template<typename T>
>       T* atomic_exchange_explicit(atomic<T*>&,void*,memory_order) = delete;
>       template<typename T>
>       T* atomic_compare_exchange_weak(atomic<T*>&,T**,T*);
>       template<typename T>
>       T* atomic_compare_exchange_weak(atomic<T*>&,void**,void*) = delete;
>       template<typename T>
>       T* atomic_compare_exchange_weak_explicit(atomic<T*>&,T**,T*,memory_order);
>       template<typename T>
>       T* atomic_compare_exchange_weak_explicit(atomic<T*>&,void**,void*,memory_order) = delete;
>       template<typename T>
>       T* atomic_compare_exchange_strong(atomic<T*>&,T**,T*);
>       template<typename T>
>       T* atomic_compare_exchange_strong(atomic<T*>&,void**,void*) = delete;
>       template<typename T>
>       T* atomic_compare_exchange_strong_explicit(atomic<T*>&,T**,T*,memory_order);
>       template<typename T>
>       T* atomic_compare_exchange_strong_explicit(atomic<T*>&,void**,void*,memory_order) = delete;

>     }