[cfe-dev] A question about when a defaulted move assignment operator is deleted

ZhangXiongpang zhangxiongpang at gmail.com
Wed May 15 20:42:23 PDT 2013

Platform: linux, x86_84, clang++3.3 (trunk 178517), g++4.7.2

I'm learning C++11 standard, and often write some code to test clang++.
But sometimes I'm not sure whether my understanding is right when clang++
does not work as my expecting.

12.8/p23 in N3290:
A defaulted copy/move assignment operator for class X is defined as deleted
if X has:
  -- for the move assignment operator, a non-static data member or direct
base class with a type that does
     not have a move assignment operator and is not trivially copyable, or
any direct or indirect virtual
     base class.
Does it partially mean that the defaulted move assignment operator for class
X is defined as deleted if X has any direct or indirect virtual base class?

If my understanding is right, then the following code shall be ill-formed
(because D::operator=(D&&) is defined as deleted):
struct B {};
struct D : virtual B {
    D& operator=(const D&) = delete; // #1
    D& operator=(D&&) = default;     // #2
void test() {
    D d1, d2;
    d1 = static_cast<D&&>(d2);  // #3: call D::operator=(D&&)

But both clang++ and g++ not report error at #3.
I'm not sure whether clang++ doesn't support it or my understanding is

View this message in context: http://clang-developers.42468.n3.nabble.com/A-question-about-when-a-defaulted-move-assignment-operator-is-deleted-tp4032130.html
Sent from the Clang Developers mailing list archive at Nabble.com.

More information about the cfe-dev mailing list