2010-05-20 23 views
5

El borrador de trabajo indica explícitamente que funciones predeterminadas deben ser funciones miembro especiales (por ejemplo, copy-constructor, default-constructor, etc., (§8.4.2.1-1)). Lo cual tiene perfecto sentido.¿Puede cualquier función ser una función eliminada?

Sin embargo, no veo ninguna restricción de este tipo en las funciones suprimidas (§8.4.3). ¿Está bien?

O en otras palabras, ¿estos tres ejemplos son válidos 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; 
+1

¿Qué es una función eliminada? – Puppy

+1

Una función eliminada es una que habría existido si no se hubiera eliminado. P.ej. puede eliminar la copia de clase ctor. Esto es ligeramente superior a hacerlo privado sin implementar, por dos razones. 1. es más obvio cuando lee el código y 2. puede obtener un mensaje de error más claro. – MSalters

+2

@MSalters: también puede eliminar funciones que no existen, lo que impide su uso. P.ej. dado 'void f (doble); void f (int) = delete; ', f (42) ahora es un error en lugar de usar conversión implícita. –

Respuesta

4

La especificación de C++ 0x (§ [dcl.fct.def.delete]) no niega dichos constructos, y g ++ 4.5 reconoce los 3 de ellos.

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 
-3

Por lo que entiendo de la definición de las funciones miembro "borrado", es que sólo se aplica a las funciones miembro especiales (constructor, copia, cesión) que pueden ser creados automáticamente por el compilador y no al miembro ordinario funciones (que no tiene sentido en absoluto IMO, para declarar que las funciones se "eliminen", así que no las declare de todos modos)

+1

Se puede usar para cualquier función que tenga un valor predeterminado. Por ejemplo, para deshabilitar la promoción. – a1ex07

4

Creo que están bien.

= delete es bueno para asegurar que no se use una sobrecarga (§8.4.3/2), que es útil fuera de las clases.

Ahora, 5 meses después, veo las otras respuestas ... delete no solo es útil para funciones con definiciones implícitas. Es la alternativa limpia a un comentario que dice "no hay implementación, usar esto es un error de enlazador". Proporciona una forma explícita de no implementar algo, por ejemplo, una plantilla base donde solo existen especializaciones explícitas. El compilador se quejará antes del tiempo del enlace.

Para un ejemplo ligeramente extraño, pero totalmente razonable, considere

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

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

Tanto = 0 y = delete se puede utilizar en la misma función. Sin = delete, el usuario puede dar una llamada de cortesía accidental al abc::do_something().

No me sorprendería si la próxima iteración de C++ después de C++ 0x agrega clases explícitamente eliminadas.

Cuestiones relacionadas