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

时间:2016-02-25 10:31:24

标签: c++ ofstream default-parameters

我声明一个带有info-string作为默认参数的日志记录函数。

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

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

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

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

那么两个声明之间的差异在哪里?

1 个答案:

答案 0 :(得分:3)

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