我有一个具有此签名的方法
void SetFoo(QString& foo);
我正在尝试传入空字符串内联,但没有以下编译
SetFoo("");
SetFoo(QString(""));
(错误:调用'MyClass :: SetFoo(QString)'没有匹配函数)
但如果我创建一个这样的变量,它就可以了。
QString emptyFoo = "";
SetFoo(emptyFoo);
如果没有明确创建变量,是否无法调用方法?
注意: 使用vc ++编译器似乎在Windows环境中都可以工作但我在linux环境中使用g ++遇到了上面提到的编译错误。
答案 0 :(得分:5)
您可以将全局对象创建为const QString nullStr()
并在任何地方使用它 - 与Null Object Pattern有些相似。
另外,正如billz提到的那样,const
对临时的引用可能存在,因此将其const Qstring&
will enable the first 2 versions
无论如何,如果您不打算修改它,您应该将引用更改为const Qstring&
。
答案 1 :(得分:2)
要绑定对临时对象的引用,需要const
限定符,如果QString构造函数接受char*
输入,请尝试:
void SetFoo(const QString& foo);
仅将对outlived变量的引用传递给SetFoo是有意义的:
void SetFoo(QString& foo);
QString s;
SetFoo(s);
。 注意:使用vc ++编译器,所有东西似乎都在windows环境中工作,但我在linux环境中使用g ++遇到了上面提到的编译错误。
VisualStudio以其C ++扩展而闻名(好的或坏的方式),你的代码在VS上编译并不意味着它是C ++标准。更好的方法是在编写代码时打开编译警告(级别4),它应该给出一个警告,用于绑定对临时对象的引用。
还要查找C ++标准,查找编译器手册以确保您的代码是可移植的。