foi um construtor bruto-ponteiro de shared_ptr um erro?

Em retrospectiva, dada amake_shared, seriashared_ptr tem um construtor que usa um ponteiro bruto se ele tivesse sido introduzido no C ++ 11?

Existem argumentos fortes ou casos de uso em favor desse construtor?

Teria evitado a armadilha bem documentada deexceção-segurança e aalocação de memória / vantagem de desempenho de usarmake_shared.

Eu acredito que outra vantagem de exigirshared_ptr construção viamake_shared seria que ele poderia ser um ponteiro único embaixo do capô, diminuindo o uso de memória e criando coisas comoatomic_compare_exchange muito mais simples (e possivelmente mais eficiente). (Vejoapresentação do C ++ Now)

EDITAR

Eu entendo que um shared_ptr que basicamente é um intrusive_ptr (com o objeto e o bloco de controle coalescidos) não apresentaria os recursos que o std :: shared_ptr atual possui. Gostar:

a capacidade de liberar o objeto separadamente do bloco de controle (o que é bom se você viver por muito tempo fraco_ptrs)

compatibilidade com bibliotecas que fornecem ponteiros brutos e a responsabilidade de liberá-los

a capacidade de reter recursos arbitrários com deleters personalizados (ou sem deleter, para ponteiros não proprietários)

a capacidade de apontar para um subobjeto (por exemplo, um membro) enquanto mantém o objeto pai ativo.

O que estou sugerindo é que esses recursos podem não ser usados com bastante frequência (ou, no caso de usá-lo como empacotador de raii), podem não ser os mais adequados, para garantir o custo extra:

um ponteiro separado para o bloco de controle(potencialmente) lógica atomic_compare_exchange mais complexa, pode não valer a pena.

Em um mundo C ++ 98 (onde o shared_ptr foi introduzido), make_shared é menos prático e menos amigável (a falta de encaminhamento perfeito requer wrappers de referência e a falta de modelos variados torna a implementação desajeitada).

questionAnswers(3)

yourAnswerToTheQuestion