此代码段(https://gcc.godbolt.org/z/hKDMxm):
#include <iostream>
#include <sstream>
using namespace std;
int main() {
auto s = (ostringstream{} << "string").str();
cout << s;
return 0;
}
可以使用msvc进行编译和运行,但是无法使用clang 9.0.0和gcc 9.2进行编译,并显示以下错误消息:no member named 'str' in 'std::basic_ostream<char>'
。观察https://en.cppreference.com/w/cpp/io/basic_ostringstream/str,显然有str()
的{{1}}成员。为什么clang和gcc无法编译此代码?
答案 0 :(得分:6)
显然
str()
有ostringstream
名成员
是的,但是根据cppreference,这种<<
的重载应该返回对basic_ostream<...>
的引用,而不是对ostringstream
的引用。
libstdc ++(GCC的标准库)完全做到了这一点,而libc ++(Clang的标准库)和MSVC的标准库在技术上在这里表现不正确。
但是,似乎有一个开放的defect report暗示<<
的重载适用于右值流,应该返回传递给它的确切流类型。如果它被接受,您的代码将是有效的。
答案 1 :(得分:2)
operator<<
是std::ostream
的成员,并按照here
std::ostream&
。
对于std::ostringstream
,MSVC显然对此操作符有自己的重载,这不是标准的