Search code examples
c++functionc++11defaultmember

C++11: When do we need to specialize "=default" for default member function?


Did a simple test and found that, "=default" only works for special member functions, like this:

#include<cstdio>
#include<utility>
struct Base{
    Base(int){printf("Base(int)\n");}
};
struct Derived{
    Derived(int)=default;
};
int main(){
    Derived d(0);
    return 0;
}

clang will report compilation error:

error: only special member functions may be defaulted

So if only "special member function" is allowed, this "=default" seems to be useless: because if I don't give definition of special member functions in "Derived", compiler will generate one for me, equal to using "=default".

So my question is, why and when do we need "=default"?


Solution

  • because if I don't give definition of special member functions in "Derived", compiler will generate one for me, equal to using "=default".

    Because there're cases that some of the special member functions won't be generated, e.g. when you declare copy constructor, move constructor won't be generated, then move requests would be processed by copy constructor. Adding (defaulted) move constructor could prevent that:

    struct Derived {
        Derived(const Derived&) { ... }
        Derived(Derived&&) = default;
    };