【发布时间】:2012-05-11 10:54:37
【问题描述】:
这是我在 const-ref 中从未完全理解的事情,我真的希望有人可以向我解释。
当在另一个函数内部调用一个函数时,我知道 const-ref 是传递我不打算篡改的堆栈对象时的最佳方式。例如:
void someInnerFunction(const QString& text) {
qDebug() << text;
}
void someFunction() {
QString test = "lala";
....
someInnerFunction(test);
}
到目前为止一切都很好,我猜。但是信号呢?传递参考是否有任何风险?即使它是const。感觉就像我一直在阅读有关 const-ref 的所有文档,但我仍然觉得有点冒险,因为我将其理解为“发送对对象的引用并保留它const”。如果它所指的对象超出范围怎么办?
例如:
void someFunction() {
connect(this, SIGNAL(someSignal(const QString&)), this, SLOT(someSlot(const QString&)));
QString test = "lala";
emit someSignal(test);
// doesnt test go out of scope here? and since im not using queued connection the QString object doesnt get copied.
}
void someSlot(const QString& test) {
qDebug() << test; // will this work?
}
这里到底发生了什么?我经常在函数调用中使用 const-ref,我只想访问对象但不更改它。但是信号呢?大多数信号在 Qt 文档中似乎都有 const-ref parm,但它是如何工作的?
【问题讨论】:
-
“当在另一个函数内部调用一个函数时,我知道 const-ref 是传递对象时的最佳方式。” 这是一个非常通用的方法回答一个基本的 C++ 问题,谁告诉你的?
-
我的意思是如果你不打算改变它们。好像qt到处都在使用这种方法,是的,我不是到处都这样做。但是什么时候不好呢?我只谈论我不想将它们复制到函数的堆栈对象
-
基本上认为,当必须将堆栈对象作为 in-parm 传递时,以下讨论是有趣的。 stackoverflow.com/questions/270408/… 但我的问题更多的是如何处理信号,因为某些 ppl 声明它应该由 const-ref 完成,这样我们就不必复制对象
-
对于直接连接,发出的信号只是围绕 Qt 为您调用一个或多个槽函数的语法糖,因此它的工作方式与调用普通 C++ 方法的方式相同(除了没有返回值当然,被传递回调用者)。对于排队的连接,Qt 无论如何都会复制参数。
标签: c++ qt signals-slots const-reference pass-by-const-reference