Это зависит.
Это укусило меня раньше, когда я хотел добавить какую-то особую логику каждый раз, когда объект подключен к сигналам другого объекта. Это наиболее вероятный случай, чтобы укусить вас.
Кроме того, это может затруднить точное отслеживание того, когда другие объекты подключаются к какому-либо данному объекту.
Я бы сказал, скрыть соединения за функцией, чтобы быть на безопасной стороне.
Обычно я использую макрос для определения ванильной функции.
#define SIGNAL(slot,name) connection name(function<slot> func) { return _##name##.connect(func);}
А затем в определении класса:
SIGNAL(void(),clicked)
Это предполагает, что вы следуете соглашению о присвоении имени сигналу _clicked, но вы можете заменить любое соглашение. Обычно он поддерживает чистоту интерфейса для всех ваших классов. Когда вы хотите добавить специальную логику соединения, вы можете, не изменяя все другие объекты, которые используют сигнал.
EDIT
Один случай произошел, когда объект сигнала был фактически перемещен в реализацию делегата внутри другого класса, но для объектов все еще имел смысл подключаться через исходный класс. Это сломало все места, которые пытались подключиться к нему. Если бы они использовали средства доступа к функциям для подключения, это было бы так же просто, как изменить функцию для поиска сигнала в делегате. Но как это было сломано все пользователи оригинального класса.
Или когда мне хотелось каждый раз регистрировать что-то, связанное с определенным сигналом. Это было сделано только для целей отладки, но может быть очень полезно, если вы подозреваете, что происходит что-то нехорошее, например циклы в ваших сигнальных соединениях.