unique_ptr <T> eliminador personalizado lambda para la especialización de matriz [duplicado]

Esta pregunta ya tiene una respuesta aquí:

¿Cómo uso un eliminador personalizado con un miembro std :: unique_ptr? 6 respuestas

ecientemente comencé a transferir muchos de mis códigos de aplicación C ++ existentes a C ++ 11 y ahora que me estoy convirtiendo a los nuevos punteros inteligentesstd :: unique_ptr ystd :: shared_ptr, Tengo una pregunta específica sobre eliminadores personalizados. Quiero agregar un registrador lambda para ver dónde se llaman mis eliminaciones, pero no puedo obtener la versión de especialización de matriz para compilar. Los consejos serían muy apreciados.

He estado buscando en vano un ejemplo de un eliminador personalizado para la especialización de matriz unique_ptr para VC ++ 10 oGCC 4.5.2 +. Me gustaría imprimir un mensaje de registro cuando se llama a los borradores en una lambda, principalmente para asegurarme de que todos los punteros que creo que están fuera de alcance lo están haciendo. ¿Es esto posible para la versión de matriz de la especialización? Puedo hacer que funcione con la versión sin matriz, y también puedo hacer que funcione con una especialización de matriz si paso una estructura externa "MyArrayDeleter" como segundo argumento. Más aún, ¿sería posible eliminar el feostd :: function como pensé que podía dejar que la firma lambda lo descubriera.

struct MySimpleDeleter {
    void operator()(int* ptr) const {
        printf("Deleting int pointer!\n");
        delete ptr;
    }
};
struct MyArrayDeleter {
    void operator()(int* ptr) const {
        printf("Deleting Array[]!\n");
        delete [] ptr;
    }
};
{
    // example 1 - calls MySimpleDeleter where delete simple pointer is called
    std::unique_ptr<int, MySimpleDeleter> ptr1(new int(5));

    // example 2 - correctly calls MyArrayDeleter where delete[] is called
    std::unique_ptr<int[], MyArrayDeleter> ptr2(new int[5]);

    // example 3 - this works (but default_delete<int[]> would have been passed
    // even if I did not specialize it as it is the default second arg
    // I only show it here to highlight the problem I am trying to solve
    std::unique_ptr<int[], std::default_delete<int[]>> ptr2(new int[100]);

    // example 3 - this lambda is called correctly - I want to do this for arrays
    std::unique_ptr<int, std::function<void (int *)>> ptr3(
        new int(3), [&](int *ptr){ 
            delete ptr; std::cout << "delete int* called" << std::endl; 
        });

    // example 4 - I cannot get the following like to compile
    // PLEASE HELP HERE - I cannot get this to compile
    std::unique_ptr<int[], std::function<void (int *)>> ptr4(
        new int[4], [&](int *ptr){  
            delete []ptr; std::cout << "delete [] called" << std::endl; 
        });
}

The compiler error is as follows:

The error from the compiler (which complains about the new int[4] for ptr4 below is:
'std::unique_ptr<_Ty,_Dx>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty,_Dx>'
1>          with
1>          [
1>              _Ty=int [],
1>              _Dx=std::tr1::function<void (int *)>
1>          ]
1>          c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory(2513) : see declaration of 'std::unique_ptr<_Ty,_Dx>::unique_ptr'
1>          with
1>          [
1>              _Ty=int [],
1>              _Dx=std::tr1::function<void (int *)>
1>          ]

Respuestas a la pregunta(2)

Su respuesta a la pregunta