Подтвердить что ты не робот

Тип аргумента для сигнала и слота Qt, имеет ли значение задание отступников?

Для сигнала и слота ниже типа

signals:
    void textChanged(const QString &);

public slots:
    void setText(const QString & text)

тип аргумента textChanged и setText, похоже, работает с инвариантом const и &. Имеет ли постоянная и ссылочная квалификация какие-либо различия по сравнению с использованием только QString?

QObject::connect(a,SIGNAL(textChanged(QString)),b,SLOT(setText(QString)));
QObject::connect(a,SIGNAL(textChanged(const QString &)),b,SLOT(setText(const QString &)));

EDIT: Я не заметил окно вывода, отображающее сообщения об ошибках, когда в SIGNAL или SLOT используется несовместимый тип. Я думал, что механизм слота сигнала способен обнаруживать ошибку типа аргумента во время компиляции.

4b9b3361

Ответ 1

Qt проверяет нормальную подпись что означает

Нормализация уменьшает пробелы до минимум, движется "const" на фронт где это уместно, удаляет 'const' из типов значений и заменяет константу ссылки со значениями.

Ответ 2

Отказ от ответственности: мой qt довольно ржавый, но механизм сигнала/слота по-прежнему остается только вызовом функций С++. Если механизм сигнала/слота фактически копирует объекты во внутреннее хранилище, мои извинения (вам нужно проверить Qt-страницы, там большой на сигналах/слотах afaik), так как бит ниже будет иметь значение только в контексте С++, а не в контексте С++ + Qt.

Если вы не укажете ссылку, строка будет скопирована (и наличие константы не имеет значения, любые изменения, внесенные в нее, останутся в функции).
Если вы оставите в ссылке, но выберете const, вы разрешите методу изменять строку, которую вы ему даете. Они оба работают, но выполняют разные вещи с передаваемым вами объектом (количество копий/возможность сохранения изменений).

Предлагаю вам прочитать следующие ресурсы:

(по константной корректности) https://isocpp.org/wiki/faq/const-correctness

(по ссылкам) https://isocpp.org/wiki/faq/references

чтобы точно понять, что такое передающий параметр и как void foo(const A&)/ void foo(const A)/ void foo(A&)/ void foo(A) все разные.