(string&)string() 和 (string&)" 作为默认参数有什么区别?

What is the difference between (string&)string() and (string&)"" as a default parameter?

本文关键字:string 什么 参数 区别 默认      更新时间:2023-10-16

我声明了一个带有信息字符串作为默认参数的日志记录函数。

void LogError(ErrorEnum error, string& infoStr = (string&)"")

当在没有附加字符串的情况下调用函数时,我在尝试以这种方式写入日志流时会出现未经处理的异常:

    ofstream mystream;
   //do some stuff
   mystream<< "Error " << infoStr << " failed!" << endl;

如果 ich 将默认参数更改为 (string&)string(),则不会再发生异常。使用 VS2013 进行调试表明,在这两种情况下,infoStr 的值都是 "。

那么这两个声明之间的区别在哪里?

在第一种情况下,您基本上是从char const (&) [1]转换为string&。这显然是站不住脚的。 std::string是一个类,它不是单例字符数组,因此例外。在第二种情况下,您将临时从右值转换为右值。这是可疑的,但由于引用的值实际上是同一类型的,因此效果很好。