1. Это ведь вызов функции, а написано частично как определение функции с void и фигурными скобками. Тут ошибка оформления? Или (сильно сомневаюсь) это действительно определение ф-ии и можно написать определение функции с new в списке аргументов?
Это не вызов функции, а её определение. При вызове функции указывать тип возвращаемого значения нет смысла, однако и параметры по умолчанию для умных указателей таким образом задавать нельзя (через конструктор, как это сделал автор стать).
Полагаю, что автор статьи изначально планировал сделать определение функции как-то так:
void functiona(std::unique_ptr<A> c1 = std::make_unique<A>(), std::unique_ptr<B> c2 = std::make_unique<B>()) {
// какой-то код
}
Такой код действительно сработает и во время выполнения функции std::make_unique будет происходить также выделение динамической памяти (как при использовании new), однако такой вариант работает без вызова конструктора умных указателей (через оператор присваивания).
В статье действительно содержится ошибка в программном коде. Оператор new, в данном случае, вызвать не получится, а вот std::make_unique - без проблем (но не рекомендую так делать).