2014-11-12 19 views
7

Der Abschnitt definiert N3797::12.8/11 [class.copy] sagt:Der Fall, wenn die Kopie-Konstruktor implizit als gelöscht

An-implizit deklariert Kopieren/Verschieben Konstruktor ist ein Inline-öffentliche Mitglied seiner Klasse. Ein ausgefallenes Kopieren/Verschieben Konstruktor für eine Klasse X wird als gelöscht definiert (8.4.3), wenn X hat:

[...]

- ein nicht-statische Daten Mitglied der Klasse Typ M (oder Array davon), die nicht kopiert werden kann/verschoben wegen Überlastung Auflösung (13.3), angewandt auf M Konstruktor, führt zu einer Zweideutigkeit oder eine Funktion, die gelöscht oder unzugänglichen vom ausgefallenen Konstruktor entsprechenden

Der erste Fall über die Mehrdeutigkeit des entsprechenden Copy/Move-Konstruktors ist ziemlich klar. Wir können folgendes schreiben:

#include <iostream> 
using namespace std; 

struct A 
{ 
    A(){ } 
    A(volatile A&){ } 
    A(const A&, int a = 6){ } 
}; 

struct U 
{ 
    U(){ }; 
    A a; 
}; 

U u; 

U t = u; 

int main(){ } 

um das zu reflektieren. Aber was ist mit oder einer Funktion, die aus dem Standardkonstruktor gelöscht oder nicht zugegriffen werden kann? Was ist das mit einer Funktion, auf die der Standardkonstruktor nicht zugreifen kann? Könnten Sie ein Beispiel dafür geben?

+0

Es sagt * defaulted-Konstruktor *, nicht "default constructor" - dies bezieht sich auf den Standard-Copy/Move-Konstruktor –

Antwort

6

Einfach gesagt:

struct M { M(M const&) =delete; }; 
struct X { X(X const&) =default; M m; }; // X(X const&) is actually deleted! 

Implizit deklarierte Funktionen werden auch als "ausgefallen" angesehen ([dcl.fct.def.default]/5); ein vertrautes Pre-C++ 11 Beispiel so etwas wie sein könnte:

struct M { protected: M(M const&); }; 
struct X { M m; }; // X's implicit copy constructor is deleted! 

Beachten Sie, wenn Sie explizit die Funktion nach Standard erklärt wurde, ist das Programm schlecht gebildet, wenn die Funktion implizit wäre gelöscht ([dcl.fct.def.default]/5):

struct M { M(M const&) =delete; }; 
struct X { X(X const&); M m; }; 

X::X(X const&) =default; // Not allowed. 
+2

+1, nett [Beispiel] (http://coliru.stacked-crooked.com/a/51ef1acf1d514c68) – Niall

+0

In der Tat, danke .. –

0

ein nicht-statisches Datenelement vom Typ M-Klasse (oder Array davon), die kopiert werden können/verschoben, weil Überlastungs Auflösung (13.3), wenn sie auf den entsprechenden Konstruktor von M angewendet werden, führt zu einem Ambigui ty oder eine Funktion, die unzugänglich oder vom ausgefallenen Konstruktor gelöscht

Die Formulierung ist vielleicht etwas gekünstelt, für Prägnanz ganz sicher. Die Idee, wie betont in der oben ist, dass die Funktion in Frage ist die MCopykonstruktor in Art und Weise überlastet zu werden, die sie unzugänglich macht. Mit einem Member der Klasse M, dessen Kopierkonstruktor beispielsweise protected ist, würde delete der Kopierkonstruktor X sein. Ebenso würde das Löschen des Kopierkonstruktors von M das gleiche Ergebnis haben.

Verwandte Themen