使用 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 显然 ostringstream
有 str()
成员。为什么 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 传递给它的确切流类型。如果它被接受,您的代码将有效。
此代码段 (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 显然 ostringstream
有 str()
成员。为什么 clang 和 gcc 无法编译此代码?
operator<<
是 std::ostream
的成员,returns std::ostream&
如 here
MSVC 显然为 std::ostringstream
重载了此运算符,但标准中没有
there is clearly
str()
member ofostringstream
是的,但根据 cppreference,<<
的重载应该 return 引用 basic_ostream<...>
而不是 ostringstream
。
libstdc++(GCC 的标准库)正是这样做的,而 libc++(Clang 的标准库)和 MSVC 的标准库在技术上在这里表现不正确。
但是,似乎有一个开放的 defect report 建议与右值流一起使用的 <<
的重载应该 return 传递给它的确切流类型。如果它被接受,您的代码将有效。