(string&)string() 和 (string&)"" 作为默认参数有什么区别?
What is the difference between (string&)string() and (string&)"" as a default parameter?
我声明了一个以信息字符串作为默认参数的日志记录函数。
void LogError(ErrorEnum error, string& infoStr = (string&)"")
当在没有附加字符串的情况下调用该函数时,我在尝试以这种方式写入日志流时遇到未处理的异常:
ofstream mystream;
//do some stuff
mystream<< "Error " << infoStr << " failed!" << endl;
如果把默认参数改成(string&)string(),就不会再出现异常了。使用 VS2013 调试表明,在这两种情况下,infoStr 的值都是 "".
那么这两个声明的区别在哪里呢?
在第一种情况下,您基本上是从 char const (&) [1]
转换为 string&
。这显然是无效的。 std::string
是一个 class,它不是单例字符数组,因此例外。在第二种情况下,您正在将临时值从右值转换为左值。这是可疑的,但由于引用值实际上是同一类型,因此可以正常工作。
我声明了一个以信息字符串作为默认参数的日志记录函数。
void LogError(ErrorEnum error, string& infoStr = (string&)"")
当在没有附加字符串的情况下调用该函数时,我在尝试以这种方式写入日志流时遇到未处理的异常:
ofstream mystream;
//do some stuff
mystream<< "Error " << infoStr << " failed!" << endl;
如果把默认参数改成(string&)string(),就不会再出现异常了。使用 VS2013 调试表明,在这两种情况下,infoStr 的值都是 "".
那么这两个声明的区别在哪里呢?
在第一种情况下,您基本上是从 char const (&) [1]
转换为 string&
。这显然是无效的。 std::string
是一个 class,它不是单例字符数组,因此例外。在第二种情况下,您正在将临时值从右值转换为左值。这是可疑的,但由于引用值实际上是同一类型,因此可以正常工作。