Frage

Der Arbeitsentwurf ausdrücklich fordert, dass vorbelegt-Funktionen müssen spezielle Member-Funktionen (zB Copy-Konstruktor, default-Konstruktor, etc, (§8.4.2.1-1)). Das macht durchaus Sinn.

Aber ich sehe keine solche Beschränkung auf deleted-Funktionen (§8.4.3). Ist das richtig?

Oder mit anderen Worten sind diese drei Beispiele gültig c++0?

struct Foo
{
   // 1
   int bar( int ) = delete;
};


// 2
int baz( int ) = delete;


template< typename T >
int boo( T t );

// 3
template<>
int boo<int>(int t) = delete;
War es hilfreich?

Lösung

Die C ++ 0x spec (§ [dcl.fct.def.delete]) bestreitet nicht, solche Konstrukte, und g ++ 4.5 erkennt alle drei von ihnen.

x.cpp: In function 'int main()':
x.cpp:4:8: error: deleted function 'int Foo::bar(int)'
x.cpp:21:11: error: used here
x.cpp:9:5: error: deleted function 'int baz(int)'
x.cpp:22:2: error: used here
x.cpp:9:5: error: deleted function 'int baz(int)'
x.cpp:22:8: error: used here
x.cpp:17:5: error: deleted function 'int boo(T) [with T = int]'
x.cpp:23:7: error: used here

Andere Tipps

Ich glaube, sie sind alle in Ordnung.

= delete ist gut für eine Überlastung gewährleistet nicht verwendet wird (§8.4.3 / 2), was nützlich außerhalb Klassen sind.

Now 5 Monate später sehe ich die anderen Antworten ... delete ist für Funktionen mit impliziten Definitionen nicht nur nützlich. Es ist die saubere Alternative zu einem Kommentar zu sagen „keine Implementierung - mit diesem ein Linker-Fehler ist.“ Es stellt eine explizite Möglichkeit, nicht etwas zu implementieren, zum Beispiel einer Vorlage Basis, wo nur explizite Spezialisierungen tatsächlich existieren. Der Compiler wird vor Link Zeit beschweren.

Für ein etwas seltsam, aber völlig angemessen Beispiel betrachtet

class abc {
protected:
    inline virtual ~abc() = 0;
    inline virtual void do_something() = 0;
};

abc::~abc() {}
void abc::do_something = delete;

Sowohl = 0 und = delete können auf der gleichen Funktion verwendet werden. Ohne = delete kann der Benutzer einen zufälligen Höflichkeitsbesuch abc::do_something() geben.

ich würde nicht überrascht sein, wenn die nächste Iteration von C ++ nach C ++ 0x Klassen explizit gelöscht erstellt.

Von dem, was ich von der Definition des Begriffs „gelöscht“ Member-Funktionen zu verstehen, ist, dass es nur von speziellen Mitgliederfunktionen gilt (Konstruktor, kopieren, Zuordnung), die automatisch vom Compiler erstellt werden kann und nicht auf gewöhnliche Mitgliederfunktionen (die Marken keinen Sinn, überhaupt IMO, Funktionen zu erklären, „gelöscht“ werden, also nicht erklären sie einfach nicht sowieso)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top