为什么stringstream的这种使用在linux上不起作用,但在Mac上运行?

时间:2017-11-30 02:42:24

标签: c++

我有这段代码将一些t转换为整数:

template <class T>
int toInt(const T& t)
{
  int i = -1;
  (std::stringstream() << t) >> i;

   return i;
}

这在我的Mac上工作正常,但每当我尝试在我学校的linux机器上使用它时,它都无法编译。我必须改用这样的东西:

template <class T>
int toInt(const T& t)
{
  int i = -1;
  std::stringstream ss;
  ss << t;
  ss >> i;

  return i;
}

哪种方法正常。

为什么会这样?

1 个答案:

答案 0 :(得分:5)

来自<<的{​​{1}}继承的运营商std::basic_stringstream会返回std::basic_ostream引用作为结果。运算符std::basic_ostream &不适用于>>。出于这个原因,表达式

std::basic_ostream

不应该编译。

我不能立即清楚为什么它会在你的Mac上编译。

作为补充说明,在预先C ++ 11版本的语言中

(std::stringstream() << t) >> i

对于那些依赖std::stringstream() << t 的非成员实施的t来说已经是不合理的了。 operator <<的独立实现将非const引用作为其LHS参数。