Pelo que entendi, C ++ 14 foi introduzido std::make_unique
porque, como resultado da ordem de avaliação dos parâmetros não ser especificada, isso não era seguro:
f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
(Explicação: se a avaliação primeiro alocar a memória para o ponteiro bruto, em seguida, chamar g()
e uma exceção for lançada antes da std::unique_ptr
construção, a memória será perdida.)
Chamar std::make_unique
era uma forma de restringir a ordem da chamada, tornando as coisas seguras:
f(std::make_unique<MyClass>(param), g()); // Syntax B
Desde então, C ++ 17 esclareceu a ordem de avaliação, tornando Sintaxe Um cofre também, então aqui está a minha pergunta: existe ainda uma razão para usar std::make_unique
ao longo std::unique_ptr
do construtor em C ++ 17? Voce pode dar alguns exemplos?
A partir de agora, a única razão que posso imaginar é que ele permite digitar MyClass
apenas uma vez (supondo que você não precise confiar no polimorfismo com std::unique_ptr<Base>(new Derived(param))
). No entanto, esse parece um motivo muito fraco, especialmente quando std::make_unique
não permite especificar um deleter enquanto std::unique_ptr
o construtor de faz.
E só para ficar claro, não estou defendendo a remoção std::make_unique
da Biblioteca Padrão (mantê-la faz sentido, pelo menos para compatibilidade com versões anteriores), mas sim me perguntando se ainda há situações em que é fortemente preferidostd::unique_ptr
std::make_unique
em primeiro lugar, não acho que seria motivo suficiente para adicioná-lo ao STL, especialmente quando é uma sintaxe menos expressiva do que usar o construtor, não mais
std::unique_ptr
? Não é um argumento contramake_unique