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

### 879. Atomic load const qualification

Section: 33.5 [atomics] Status: NAD Editorial Submitter: Alexander Chemeris Opened: 2008-08-24 Last modified: 2016-01-28

Priority: Not Prioritized

View all other issues in [atomics].

View all issues with NAD Editorial status.

Discussion:

The `atomic_address` type and `atomic<T*>` specialization provide atomic updates to pointers. However, the current specification requires that the types pointer be to non-const objects. This restriction is unnecessary and unintended.

[ Summit: ]

> Move to review. Lawrence will first check with Peter whether the current examples are sufficient, or whether they need to be expanded to include all cases.

[ 2009-07 Frankfurt ]

> Lawrence will handle all issues relating to atomics in a single paper.

> LWG will defer discussion on atomics until that paper appears.

> Move to Open.

[ 2009-08-17 Handled by N2925. ]

[ 2009-10 Santa Cruz: ]

> NAD Editorial. Solved by N2992.

Proposed resolution:

Add const qualification to the pointer values of the `atomic_address` and `atomic<T*>` specializations. E.g.

>     typedef struct atomic_address {
>        void store(const void*, memory_order = memory_order_seq_cst) volatile;
>        void* exchange( const void*, memory_order = memory_order_seq_cst) volatile;
>        bool compare_exchange( const void*&, const void*,
>                               memory_order, memory_order) volatile;
>        bool compare_exchange( const void*&, const void*,
>                               memory_order = memory_order_seq_cst ) volatile;
>        void* operator=(const void*) volatile;
>     } atomic_address;

>     void atomic_store(volatile atomic_address*, const void*);
>     void atomic_store_explicit(volatile atomic_address*, const void*,
>                               memory_order);
>     void* atomic_exchange(volatile atomic_address*, const void*);
>     void* atomic_exchange_explicit(volatile atomic_address*, const void*,
>                                   memory_order);
>     bool atomic_compare_exchange(volatile atomic_address*,
>                                 const void**, const void*);
>     bool atomic_compare_exchange_explicit(volatile atomic_address*,
>                                          const void**, const void*,
>                                          memory_order, memory_order);