为什么 std::stringstream 静态内联时不能默认构造?

Why can't std::stringstream be default constructed when it's static inline?

以下编译良好(在 g++ 8.3.0-6 和 --std=c++17 上),std::stringstream 是非静态 class 成员:

#include <iostream>
#include <sstream>

class Foo {
    public:
        std::stringstream ss;
};

int main() {
    Foo f;
    f.ss << "bar\n";
    std::cout << f.ss.str();
}

但以下不是(相同的编译器,相同的选项),其中 stringstreamstatic inline:

#include <iostream>
#include <sstream>

class Foo {
    public:
        static inline std::stringstream ss;
};

int main() {
    Foo::ss << "bar\n";
    std::cout << Foo::ss.str();
}

我的编译器告诉我 std::stringstream 没有默认构造函数,它实际上应该是:

error: no matching function for call to ‘std::__cxx11::basic_stringstream<char>::basic_stringstream()’
         static inline std::stringstream ss;
                                         ^~

我做错了什么?

这几乎可以肯定是一个编译器错误。编译器在一种情况下知道构造函数重载但在另一种情况下不知道,这有点奇怪,尽管它可能与构造函数 explicit.

有关

这样做 compile with 8.3:

#include <iostream>
#include <sstream>

class Foo {
    public:
        static inline std::stringstream ss{};
};                                      //^^ 

int main() {
    Foo::ss << "bar\n";
    std::cout << Foo::ss.str();
}

PS:这个答案也得出结论,explicit.

的原因