Другой угловой случай - для неконструируемого класса (но функция также не может быть вызвана обычным способом):
struct S{
S() = delete;
S(const S&) = delete;
};
void foo(S = {}); // Wrong
Мы могли бы попытаться расширить это с помощью видимости, используя идиому ключа доступа, что действительно запретит объявление с параметром по умолчанию в некоторых местах, но мы можем (повторно) объявить функцию (с параметром по умолчанию) в области функции, где будет доступно создание ключа ...