Pregunta

El borrador de trabajo pide explícitamente que -funciones incumplieron debe ser funciones especiales (por ejemplo, miembros constructor copia, default-constructor, etc, (§8.4.2.1-1)). Lo cual tiene mucho sentido.

Sin embargo, no veo ninguna de estas restricciones en borrados funciones (§8.4.3). ¿Es eso correcto?

O en otras palabras, son estos tres ejemplos c++0 válida?

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;
¿Fue útil?

Solución

El C ++ 0x spec (§ [dcl.fct.def.delete]) no niega tales constructos, y g ++ 4,5 reconocer todos 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

Otros consejos

creo que están todos bien.

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

Ahora 5 meses después miro a las otras respuestas ... delete no sólo es útil para las funciones con las definiciones implícitas. Es la alternativa limpia a un comentario diciendo "no implementación - utilizando este es un error de vinculador." Proporciona una manera explícita a no poner en práctica algo, por ejemplo una plantilla base, donde en realidad sólo existirán especializaciones explícitos. El compilador se quejará antes de tiempo de enlace.

Para un ejemplo un poco 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 pueden utilizar en la misma función. Sin = delete, el usuario puede dar una llamada de cortesía accidental a abc::do_something().

Me no se sorprenda si la próxima versión de C ++ C ++ 0x después añade suprime explícitamente clases.

Por lo que entiendo de la definición de "borrado" funciones miembro, es que sólo se aplica a las funciones miembro especiales (constructor, copiar, de asignación) que puede ser creado automáticamente por el compilador y no a las funciones miembro ordinarias (que hace ningún sentido en absoluto la OMI, para declarar funciones a ser "eliminado", por lo que simplemente no declarar todos modos)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top