使用 gcc 和 clang 在 'std::basic_ostream<char>' 中没有名为 'str' 的成员,但使用 msvc 没有问题

no member named 'str' in 'std::basic_ostream<char>' with gcc and clang, but no problem with msvc

此代码段 (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 显然 ostringstreamstr() 成员。为什么 clang 和 gcc 无法编译此代码?

operator<<std::ostream 的成员,returns std::ostream&here

所述

MSVC 显然为 std::ostringstream 重载了此运算符,但标准中没有

there is clearly str() member of ostringstream

是的,但根据 cppreference<< 的重载应该 return 引用 basic_ostream<...> 而不是 ostringstream

libstdc++(GCC 的标准库)正是这样做的,而 libc++(Clang 的标准库)和 MSVC 的标准库在技术上在这里表现不正确。

但是,似乎有一个开放的 defect report 建议与右值流一起使用的 << 的重载应该 return 传递给它的确切流类型。如果它被接受,您的代码将有效。