While reading the Bjarne Stroustrup's CoreCppGuidelines, I have found a guideline which contradicts my experience.

The [C.21](https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rc-five) requires the following:

> 
> If you define or `=delete` any default operation, define or `=delete` them all
> 
> 
> 

With the following reason:

> 
> The semantics of the special functions are closely related, so if one needs to be non-default, the odds are that others need modification too.
> 
> 
> 

From my experience, the two most common situations of redefinition of default operations are the following:

#1: Definition of virtual destructor with default body to allow inheritance:

```
class C1
{
...
    virtual ~C1() = default;
}

```

#2: Definition of default constructor making some initialization of RAII-typed members:

```
class C2
{
public:
    int a; float b; std::string c; std::unique_ptr<int> x;

    C2() : a(0), b(1), c("2"), x(std::make_unique<int>(5))
    {}
}

```

All other situations were rare in my experience.

What do you think of these examples? Are they exceptions of the C.21 rule or it's better to define all default operations here? Are there any other frequent exceptions?