1
void outputString(const string &ss) {
    cout << "outputString(const string& ) " + ss << endl;
}

int main(void) {
    outputString("constant tranformed to reference argument");
    //! outputString(new string("abc")); new only return pointer to object
    return 0;
}

由于它禁止创建临时对象引用转换为方法,这种语法应该是无用的,甚至会使事情变得更加混乱。那么为什么 C++ 会费心支持这种语法呢?

编辑:说实话,我不明白你的表示。考虑到上面的例子,我们通常会使用void outputString(const string ss)而不是。void outputString(const string &ss)我认为正常的事情是“按值传递”方法处理常量/变量和“按引用传递”方法只处理变量。我们应该使用const type-id &而不是const type-id常量的唯一原因是效率,因为“按引用传递”方法仅采用原始常量/对象变量的指针(地址),但“按值传递”方法需要执行复制。

谢谢。

4

4 回答 4

3

只允许为 const 参数创建临时引用。如果参数不是 const 引用,那么您可以更改方法中的数据,而不会意识到您的引用是数据的临时副本,因此被禁止。

但是,当它是 const 引用时,您无法更改数据,因此它是对副本的引用并且如此安全并不重要,因此正如您的示例所示,它很有用。

于 2009-12-24T10:09:42.383 回答
2

你在哪里修改ss

cout << "outputString(const string& ) " + ss << endl;

此行在引擎盖下创建了一个临时对象,而不修改const&对象ss

编译器通常会这样做:

string tmp = "outputString(const string& ) " + ss;
cout << tmp << endl;
于 2009-12-24T10:08:35.253 回答
2

你有什么选择?

void outputString(const string ss);

这将创建任何传递的字符串的副本,即使类型完全匹配:开销并不是真正需要的!

void outputString(string &ss);

这将允许更改传递的参数。我们不想那样做,而且 C++ 不允许我们再传递一个临时值,以保护我们免于更改一个临时值(无论如何,这些更改在接下来的时刻都会丢失)。

所以,你有它的方式适合两个方面:它允许我们传递非临时字符串而不复制它们,它允许我们传递临时字符串。它保护我们免于试图改变论点似乎是一个很好的妥协。

于 2009-12-29T19:18:24.967 回答
0

您的意思是,它允许将文字转换为 const 对象引用。

这个很重要。否则你将不得不写 OutputString(std::string("literal")) ,这会很烦人。人们会发现自己对接受 std::string 和 char* 的方法进行了单独的重载。

于 2009-12-24T10:11:20.217 回答