为什么 C++ 允许常量转换为另一个方法中的引用参数?
-
21-09-2019 - |
题
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 *的方法制作单独的重载。