为什么我不能使用“<<”运营商在退货声明中?

时间:2013-05-10 08:23:27

标签: c++ operators return stringstream

例如:

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

可以将return语句分成2个语句ss << "MB"; return ss;,错误消失了 - 为什么?

(使用MSVC ++ 2010)

2 个答案:

答案 0 :(得分:8)

因为您要返回最后一个评估语句。考虑一下这实际上在做什么:

return ss << "MB";

相当于:

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

在这种情况下,operator<<的返回类型是,如您所见,std::ostream& - 而不是您想要的std::stringstream

答案 1 :(得分:1)

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

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