2010-09-27 12 views
17

Wikipedia estados:¿Puede C++ 0x todavía asignar explícitamente con operador global nuevo?

Un tipo se puede hacer imposible asignar con el operador new:

struct NonNewable { 
    void *operator new(std::size_t) = delete; 
}; 

Un objeto de este tipo solamente siempre se puede asignar como un objeto pila o como miembro de otro tipo. No se puede asignar directamente a montones sin engaños no portátiles. (Desde la colocación de nuevo es la única manera de llamar a un constructor de la memoria asignada por el usuario y este uso ha sido prohibido que el anterior, el objeto puede no ser una buena construcción.) Operador

Eliminación de nuevo es similar a lo que es privado en C++ actual, pero no está utilizando explícitamente el operador global new, que evita la búsqueda específica de clase, ¿sigue siendo válido C++ 0x?

NonNewable *p = ::new NonNewable(); 
// neither non-portable nor trickery, though perhaps not widely known 

¿He perdido algo en el calado?


Para ser claros, esto es válido C++ 03 y works fine:

struct NonNewable { 
private: 
    void *operator new(std::size_t); // not defined 
}; 

int main() { 
    // ignore the leaks, it's just an example 

    void *mem = operator new(sizeof(NonNewable)); 
    NonNewable *p = ::new(mem) NonNewable(); 

    p = ::new NonNewable(); 

    return 0; 
} 
+1

FYI si está revisando: el texto citado ha sido eliminado del artículo de Wikipedia. –

Respuesta

6

creo que tiene razón y Wikipedia están mal. El borrador de la norma C++ 0x describe las "funciones eliminadas" (8.4p10) como funciones que no se pueden usar de ninguna manera (de lo contrario, el programa está mal formado). No juegan ningún papel en el alcance o la búsqueda de nombres diferente de las funciones normales. Y los párrafos relevantes sobre las nuevas expresiones han permanecido igual:

[5.3.4p8] Una nueva expresión obtiene almacenamiento para el objeto llamando a una función de asignación (3.7.4.1). ...

[5.3.4p9] Si la nueva expresión comienza con un operador unario ::, el nombre de la función de asignación se busca en el ámbito global. De lo contrario, si el tipo asignado es un tipo de clase T o una matriz del mismo, el nombre de la función de asignación se busca en el alcance de T. Si esta búsqueda no puede encontrar el nombre, o si el tipo asignado no es de clase, la asignación el nombre de la función se busca en el alcance global.

Así que sí, la expresión ::new NonNewable [o ::new(mem) NonNewable] elegiría una sobrecarga de ::operator new, haciendo caso omiso de la función NonNewable::operator new, y no haría que el programa mal formada.

Cuestiones relacionadas