为什么不能在 return 语句中使用 "<<" 运算符?

Why can I not use the "<<" operator in a return statement?

本文关键字:lt 运算符 不能 return 语句 为什么      更新时间:2023-10-16

例如:

std::stringstream formatMemUsage(...) {
    std::stringstream ss ...
    ...
    return ss << "MB";   // Error here
}

导致错误no suitable user-defined conversion from "std::basic_ostream<char, std::char_traits<char>>" to "std::stringstream" exists .

I 可以将返回语句分离为2个语句ss << "MB"; return ss;,并且错误消失-为什么?

(使用msvc++ 2010)

因为返回的是最后一次求值的语句。考虑一下这实际上在做什么:

return ss << "MB";

等价于:

return operator<<(ss, "MB");

如您所见,本例中operator<<的返回类型是std::ostream&,而不是您想要的std::stringstream

有几个问题。第一个是,正如Yuushi指出的,表达式ss << "MB"的类型为std::ostream&,而不是std::stringstream,并且没有隐式转换从std::ostreamstd::stringstream。第二点是流不是可复制的,所以你不可能返回一个std::stringstream(需要一个副本)。和你不能简单地将返回值更改为std::ostream&,因为这将导致返回对局部对象的引用变量;ss将在函数结束时被销毁。

你想达到什么目标?大多数时候,只是返回字符串(ss.str())将是更好的解决方案。