对于以下类型的信号和插槽
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 &)));
编辑: 当SIGNAL或SLOT中使用不兼容的类型时,我没有注意到输出窗口显示错误消息。我认为信号槽机制能够在编译时检测参数类型错误。
答案 0 :(得分:26)
Qt检查normalized signature,意思是
规范化将空格减少为a 最小,将'const'移到前面 在适当的情况下,删除'const' 从值类型和替换const 引用值。
答案 1 :(得分:4)
免责声明:我的qt相当生疏,但信号/插槽机制仍然只是C ++函数调用。如果信号/插槽机制实际上将对象复制到内部存储器中,我很抱歉(你需要检查Qt页面,信号/插槽上有一个很大的问题) - 因为下面的位只与C ++上下文相关,不在C ++ + Qt上下文中。
如果省略引用,则会复制字符串(并且const无关紧要,对其进行的任何更改都将保留在函数中)。
如果你留下引用但是取出const,你允许方法修改你给它的字符串。它们都有效,但对你传递的对象做了不同的事情(复制量/保留变化的可能性)。
我建议你阅读以下资源:
(关于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)
各有不同。