tutorial smart programar para introduccion inteligentes inteligente ejemplos crear contratos contrato c++ c++11 new-operator

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.