4

我对 Visual Studio 2013 有一个编译器错误(而 Xcode 6.2 编译),我无法理解:

以下示例代码是格式转换的摘要、精简摘录:

#include<sstream>
void main(...){
    (std::ostringstream()<<0).str();
}

在以下版本编译时:

#include<sstream>
void main(...){
    (std::ostringstream()).str();
}

语境:

std::string result=(std::ostringstream()<<value).str(); 

我在这里想念什么?谢谢!

4

2 回答 2

5

错误消息是error C2039: 'str': is not a member of 'std::basic_ostream<char,std::char_traits<char>>'。它抱怨在akastr中缺少,而不是。std::basic_ostream<char,std::char_traits<char>>std::ostreamstd::ostringstream

std::ostringstream'operator<<仍然返回std::ostream&(它从 继承这些运算符std::ostream),它没有str()成员。

Clang/libc++(这是 Xcode 使用的)在其右值流插入运算符中实现了一个扩展

  1. 与继承的成员operator<<s 相比,它更适合右值流,并且
  2. 按原样返回对流的引用,而不转换为std::ostream&.

这一起使您的代码在 Xcode 中编译。

要调用.str(),您可以手动static_cast (std::ostringstream()<<value)返回std::ostringstream&(使用std::ostringstream &&const std::ostringstream&用于 libc++ 兼容性,因为它的右值流插入运算符返回对流的右值引用)。

于 2015-04-20T10:01:10.837 回答
0
于 2015-04-20T10:12:45.003 回答