Domanda

La bozza di lavoro chiama esplicitamente che in default-funzioni deve essere funzioni membro speciali (per esempio costruttore di copia, default-costruttore, ecc, (§8.4.2.1-1)). Il che ha perfettamente senso.

Tuttavia, non vedo alcun tale restrizione -funzioni cancellato (§8.4.3). È giusto?

O in altre parole sono questi tre esempi validi 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;
È stato utile?

Soluzione

Il C ++ 0x spec (§ [dcl.fct.def.delete]) non nega tali costrutti, e g ++ 4,5 riconoscono tutti e 3 di loro.

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

Altri suggerimenti

Credo che siano tutti OK.

= delete è buono per assicurare un sovraccarico non viene utilizzato (§8.4.3 / 2), che è fuori delle classi utili.

Ora 5 mesi più tardi guardo le altre risposte ... delete non è utile solo per le funzioni con definizioni implicite. E 'il pulito alternativa ad un commento che dice "no implementazione - utilizza questo è un errore di linker." Esso fornisce un modo esplicito di non implementare qualcosa, ad esempio un modello di base in cui saranno effettivamente esistere solo specializzazioni esplicite. Il compilatore si lamenta prima che il tempo di collegamento.

Per un esempio un po 'strano, ma del tutto ragionevole, considerare

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

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

Sia = 0 e = delete possono essere utilizzate la stessa funzione. Senza = delete, l'utente può dare una chiamata di cortesia accidentale abc::do_something().

non sarei sorpreso se la prossima iterazione del C ++ dopo C ++ 0x aggiunge esplicitamente cancellato classi.

Da quello che ho capito dalla definizione di "cancellato" funzioni membro, è che essa si applica solo alle funzioni membro speciali (costruttore, copia, di assegnazione) che può essere creato automaticamente dal compilatore e non a funzioni membro ordinarie (il che rende alcun senso IMO, per dichiarare le funzioni di essere "cancellato", quindi basta non dichiararli in ogni caso)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top