如何传递 const QString 引用?

How to pass const QString references?

我有几个 'tags',我想用这些标签创建一个格式化的 QString,例如:

void createFormattedPlainText(QString & refLine, const QString & v1, const QString & v2, const QString & v3)
{
  refLine.clear();
  refLine.append("[%0] :: [%1] ++ %2").arg(v1, v2, v3);
}

所以,我想打电话给:

QString line;
createFormattedPlainText(line, "123", "**", "xxx");

但是不行,我去掉了签名中的const,否则得到:

Error: no matching function for call to 'createFormattedPlainText(QString&, const char [3], const char [2], const char [3])' createFormattedPlainText(l1, l2, "123", "**", "xxx" ); ?? ) What am I doing wrong?

你对arg()的使用是错误的,没有其他问题,你的函数签名是有效和正确的。

void createFormattedPlainText(QString & refLine, const QString & v1, const QString & v2, const QString & v3)
{
  refLine.clear();
  refLine.append("[%0] :: [%1] ++ %2").arg(v1, v2, v3);
}

int main(int argc, char *argv[])
{
QString line;
createFormattedPlainText(line, "123", "**", "xxx");
qDebug() << "line = " << line;
//...

输出:

line =  "[%0] :: [%1] ++ %2" 

正确版本:

void createFormattedPlainText(QString & refLine, const QString & v1, const QString & v2, const QString & v3)
{
  refLine.clear();
  refLine.append(QString("[%0] :: [%1] ++ %2").arg(v1, v2, v3));//Attention here
}

int main(int argc, char *argv[])
{
QString line;
createFormattedPlainText(line, "123", "**", "xxx");
qDebug() << "line = " << line;
//...

输出:

line =  "[123] :: [**] ++ xxx" 

来自 doc:

Returns a copy of this string with the lowest numbered place marker replaced by string a, i.e., %1, %2, ..., %99.

在你的情况下 refLine.append("[%0] :: [%1] ++ %2").arg(v1, v2, v3);,你 return 复制到无处可去。在我的例子中 refLine.append(QString("[%0] :: [%1] ++ %2").arg(v1, v2, v3)); 我附加到 refLine 完全构造的字符串,该字符串由 arg().

处理

P.S。当然你可以做下一步(用你的旧代码):

void createFormattedPlainText(QString & refLine, const QString & v1, const QString & v2, const QString & v3)
{
  refLine.clear();
  //arg() returns copy so just assign this copy to the refLine again
  refLine = refLine.append("[%0] :: [%1] ++ %2").arg(v1, v2, v3);
}

但我认为这是糟糕的代码,我写这个只是为了向您展示 arg() return 的副本。