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 对于常量来说是高效的,因为“按引用传递”方法仅采用基元常量/对象变量的指针(地址),但“按值传递”方法需要进行复制。

谢谢。

有帮助吗?

解决方案

你有什么办法?

void outputString(const string ss);
     

这将产生传递的任何字符串的副本,即使类型完全一致:开销,这不是真的需要

void outputString(string &ss);
     

这将允许改变传递的自变量。我们不想这样做,和C ++不允许我们穿越到临时了,保护我们免受更改临时(其中这些更改将在接下来的时刻失去了反正)。

所以,你有它适合于双方的方式:它使我们能够通过非临时字符串无需将其复制,它允许我们传递临时字符串。 的它保护我们免受试图改变说法。似乎是一个很好的妥协。

其他提示

有只允许创建用于常量参数的临时参考。如果参数不是一个常量引用,那么你可以在方法没有意识到你参照的是对数据的临时副本,所以它的禁止改变数据。

当它是一个const引用但是,你不能改变的数据,所以也没关系,它的一个副本的引用等安全,因此允许,因为它是有用的例子显示了。

你在哪里修改 ss?

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

这条线在引擎盖下创建了一个临时的 没有 修改 const& 目的 ss.

编译器通常会执行以下操作:

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

您的意思是,它允许文字应,转化成一个const对象引用。

这是很重要的。否则,你会写OutputString(的std :: string(“文字”)),这将是很烦人的。人们可能会发现自己接受的std :: string与char *的方法制作单独的重载。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top