Re: auto-generated move assignment and base or member with a
by-value assignment
Am 28.02.2014 18:07, schrieb Krzysztof Czai??ski:
I think this became clear to me now. I will now try to verify my
understanding with some statements about this example:
struct B // movable only
{
B() = default;
B( B const& ) = delete;
B( B&& ) = default;
B& operator=( B ) {}
};
- B has a copy assignment operator.
Yes, it has an explicitly declared and user-provided copy assignment operator (see below for one further remark to the definition).
- B has no move assignment operator.
Correct, there is no implicitly nor an explicitly declared move-assignment operator (The otherwise applicable implicit declaration is suppressed because of the existence of the user-declared copy-constructor, move-constructor, and copy-assignment operators [each of them would have been an exclusion argument]).
- B is not copy assignable.
Yes, I would say that it does neither satisfy the CopyAssignable requirements nor should std::is_copy_assignable<B>::value evaluate to true.
- B is move assignable.
Assuming you would fix the return statement, yes, this type would satisfy the MoveAssignable requirements and std::is_move_assignable<B>::value would evaluate to true (already without the fix, because the latter is based on an unevaluated expression test).
- B is trivially copyable.
No, because you have failed to satisfy:
"has no non-trivial copy assignment operators"
since the type has one non-trivial copy-assignment operator (because it is user-provided).
HTH & Greetings from Bremen,
Daniel Kr??gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]