[C++] CppCoreGuidelines C.21 è corretto?


Answers

Penso che forse il tuo secondo esempio sia un'eccezione ragionevole e, dopo tutto, le linee guida dicono "le probabilità sono ...", quindi ci saranno alcune eccezioni.

Mi chiedo se questa diapositiva potrebbe aiutare con il tuo primo esempio:

Ecco le diapositive: https://accu.org/content/conf2014/Howard_Hinnant_Accu_2014.pdf

EDIT: Per ulteriori informazioni riguardanti il ​​primo caso, ho scoperto questo: C ++ 11 distruttori virtuali e generazione automatica di funzioni speciali di spostamento

Question

Durante la lettura delle CoreCppGuidelines di Bjarne Stroustrup, ho trovato una linea guida che contraddice la mia esperienza.

Il C.21 richiede quanto segue:

Se si definisce o =delete qualsiasi operazione predefinita, definire o =delete tutti

Con il seguente motivo:

La semantica delle funzioni speciali è strettamente correlata, quindi se si ha bisogno di essere non-predefiniti, le probabilità sono che anche altri debbano essere modificati.

Dalla mia esperienza, le due situazioni più comuni di ridefinizione delle operazioni predefinite sono le seguenti:

N. 1: Definizione di distruttore virtuale con corpo predefinito per consentire l'ereditarietà:

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

# 2: Definizione del costruttore predefinito che effettua l'inizializzazione dei membri tipizzati RAII:

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))
    {}
}

Tutte le altre situazioni erano rare nella mia esperienza.

Cosa ne pensi di questi esempi? Sono eccezioni della regola C.21 o è meglio definire tutte le operazioni di default qui? Ci sono altre frequenti eccezioni?