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

时间:2019-12-24 20:54:01

标签: c++ gcc clang std

此代码段(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无法编译此代码?

2 个答案:

答案 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显然对此操作符有自己的重载,这不是标准的