c++ - smart - programar contratos inteligentes
¿Puede C++ 0x asignarse explícitamente con un operador global nuevo? (1)
Wikipedia dice:
Un tipo puede ser imposible de asignar con el operador nuevo:
struct NonNewable { void *operator new(std::size_t) = delete; };
Un objeto de este tipo solo se puede asignar como un objeto de pila o como miembro de otro tipo. No se puede asignar directamente en el montón sin trucos no portátiles. (Dado que la ubicación nueva es la única forma de llamar a un constructor en la memoria asignada por el usuario y este uso ha sido prohibido como se indicó anteriormente, el objeto no se puede construir correctamente).
Eliminar el nuevo operador es similar a hacerlo privado en C ++ actual, pero no está utilizando explícitamente el nuevo operador global, lo 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
¿Me he perdido algo en el draft?
Para ser claros, esto es válido en C ++ 03 y funciona bien :
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;
}
Creo que tienes razón y la wikipedia está mal. El borrador de la norma C ++ 0x describe "funciones eliminadas" (8.4p10) como funciones que no se pueden usar de ninguna manera (o el programa está mal formado). No tienen ninguna función en el alcance o en la búsqueda de nombres diferente de las funciones normales. Y los párrafos relevantes sobre nuevas expresiones han permanecido igual:
[5.3.4p8] Una nueva expresión obtiene el 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 unary ::, 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 encuentra el nombre, o si el tipo asignado no es un tipo de clase, la asignación El nombre de la función se busca en el ámbito global.
Entonces, sí, la expresión ::new NonNewable
[o ::new(mem) NonNewable
] elegiría una sobrecarga de ::operator new
, ignorando la función NonNewable::operator new
, y no haría que el programa no NonNewable::operator new
formado.