沒有爲(Q_FOREACH
,foreach
)Qt的範圍之間的基本差異,其C++ 11的同名:不能使用Qt的一個修改的容器中的元素。
原因是Qt的實現爲每個元素返回一個常量引用,而C++ 11可以使用非const引用。在你的情況下,你試圖從一個常量(Q_FOREACH
返回的那個)初始化一個引用,所以你會得到一個編譯錯誤。如您所見,它與allCookies()
方法的常量無關。
如果您直接使用迭代器或索引來迭代容器,而不是使用Q_FOREACH
,那麼您正在訪問實際元素,因此您可以修改它們。
這段代碼說明了一些可能的方式(錯誤的,正確的)使用Q_FOREACH
(免除了簡單詳盡的迭代版本)迭代:
QList<QString> stringlist; // applies to any element type
stringlist.append("foo");
// 1, compiles but doesn't modify the list since 's' is a copy
foreach (QString s, stringlist) {
s += "bar";
}
qDebug() << stringlist;
// 2, doesn't compile ('s' is constant and cannot be modified)
/*foreach (const QString& s, stringlist) {
s += "bar";
}*/
// 3, equivalent to 1, compiles but doesn't modify the list
foreach (auto s, stringlist) {
s += "bar";
}
qDebug() << stringlist;
// 4 (your case), doesn't compile, 's' cannot be initialized from a constant
/*foreach (QString& s, stringlist) {
s += "bar";
}*/
// 5, using indices
for (int ii = 0; ii < stringlist.count(); ++ii) {
stringlist[ii] += "bar";
}
qDebug() << stringlist;
// 6, using iterators
for (auto it = stringlist.begin(); it != stringlist.end(); ++it) {
*it += "bar";
}
qDebug() << stringlist;
您可以檢查this question有關如何Q_FOREACH
宏的工作更多的信息。
'QList QNetworkCookieJar :: allCookies()const'。所以編譯器抱怨,因爲allCookes()正在返回一個常量?我將如何改變'allCookies()'返回我的'QList'? –
Jon
是的,我猜它只是想讓你和setter和getters一起工作。因此,您需要複製整個列表,編輯列表,然後將Cookie設置爲新列表。在上面編輯我的答案。 – WAFFO