Topic: Volatile copyable not trivially copyable?
Author: Al Grant<algrant@myrealbox.com>
Date: Sat, 24 Mar 2012 17:55:55 -0700 (PDT)
Raw View
Given a POD struct type, say struct S { int a; };
it was always the case that if you wanted to be able to
assign to a volatile S, you had to explicitly define a
volatile-qualified copy-assignment operator:
operator=(S const&) volatile;
But this makes S "not trivially copyable". And in C++11
that means you can't instantiate std::atomic<S>.
Have I missed something? It seems strange that if I
want to wrap a primitive type in a class for abstraction
reasons (in an OS maybe) the class can either be
volatile-qualified and assigned freely, or used as the
basis for an atomic type, but not both. After all, there's
no such restriction on primitive types.
As a constructive suggestion, would there be any
consequences if the standard were to permit defining
operator=(S cv-qualifiers&) volatile = default;
and consider it a trivial copy assignment operator?
--
[ comp.std.c++ is moderated. To submit articles, try posting with your ]
[ newsreader. If that fails, use mailto:std-cpp-submit@vandevoorde.com ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]
Author: =?ISO-8859-1?Q?Daniel_Kr=FCgler?= <daniel.kruegler@googlemail.com>
Date: Sun, 25 Mar 2012 23:14:07 -0700 (PDT)
Raw View
Am 25.03.2012 01:55, schrieb Al Grant:
>
> Given a POD struct type, say struct S { int a; };
> it was always the case that if you wanted to be able to
> assign to a volatile S, you had to explicitly define a
> volatile-qualified copy-assignment operator:
> operator=(S const&) volatile;
> But this makes S "not trivially copyable". And in C++11
> that means you can't instantiate std::atomic<S>.
Correct.
> Have I missed something? It seems strange that if I
> want to wrap a primitive type in a class for abstraction
> reasons (in an OS maybe) the class can either be
> volatile-qualified and assigned freely, or used as the
> basis for an atomic type, but not both. After all, there's
> no such restriction on primitive types.
I'm not sure what precisely you mean with you comparison with
primitive types, but let me point out that there is since quite a long
time issue 496 in progress:
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#496
which would have the effect to make all volatile-qualified objects
non-trivial. This is somehow a logical conclusion, since it was always
clear (but not really clarified what the meaning of an object access
to a volatile object is) could be far from trivial. If you look at the
rationale for the C++ rule that exists since 1998 "Change: Copying
volatile objects", you will notice that similar concerns lead to this
restriction decision.
> As a constructive suggestion, would there be any
> consequences if the standard were to permit defining
> operator=(S cv-qualifiers&) volatile = default;
> and consider it a trivial copy assignment operator?
If #496 would be applied, I don't see how such a rule could be reasonably added.
My suggestion would be to add a volatile member function to your class
type that performs the copy to the volatile object and let the
compiler add the implicitly-declared (trivial) copy-assignment
operator.
HTH & Greetings from Bremen,
Daniel Kr gler
--
[ comp.std.c++ is moderated. To submit articles, try posting with your ]
[ newsreader. If that fails, use mailto:std-cpp-submit@vandevoorde.com ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]