2

我有一个具有此签名的方法

void SetFoo(QString& foo);

我正在尝试内联传递一个空字符串,但以下都没有编译

SetFoo("");
SetFoo(QString(""));

(错误:没有匹配的函数调用 'MyClass::SetFoo(QString)')

但是如果我创建一个这样的变量,它就可以工作。

QString emptyFoo = "";
SetFoo(emptyFoo);

有没有办法在不显式创建变量的情况下调用该方法?

注意:使用 vc++ 编译器在 windows 环境中似乎一切正常,但我在使用 g++ 的 linux 环境中遇到上述编译错误。

4

2 回答 2

5

您可以创建一个全局对象作为 aconst QString nullStr()并在任何地方使用它 - 有点类似于Null Object Pattern

或者,正如 billz 提到的那样,const可以存在对临时的引用,因此使其const Qstring& 启用前 2 个版本

const Qstring&无论如何,如果您不打算修改它,您应该更改引用。

于 2013-01-16T04:57:00.733 回答
2

要将引用绑定到临时对象,您需要const限定符,如果 QString 构造函数接受char*输入,请尝试:

void SetFoo(const QString& foo);

仅将对过期变量的引用传递给 SetFoo 是有意义的:

void SetFoo(QString& foo);
QString s;
SetFoo(s);

. 注意:使用 vc++ 编译器在 windows 环境中似乎一切正常,但我在使用 g++ 的 linux 环境中遇到上述编译错误。

VisualStudio 因其 C++ 扩展而闻名(无论好坏),您的代码在 VS 上编译并不意味着它是 C++ 标准。更好的方法是在编写代码时打开编译警告(级别 4),它应该给你一个绑定临时对象引用的警告。
还要查找 C++ 标准,查找编译器手册以确保您的代码是可移植的。

于 2013-01-16T04:55:58.403 回答