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

Posted

技术标签:

【中文标题】为啥 std::stringstream 在静态内联时不能默认构造?【英文标题】:Why can't std::stringstream be default constructed when it's static inline?为什么 std::stringstream 在静态内联时不能默认构造? 【发布时间】:2021-08-18 10:59:42 【问题描述】:

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

#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;
                                         ^~

我在这里做错了什么?

【问题讨论】:

适用于较新版本的godbolt.org/z/KMKnEEGjc。您是否检查过 8.3.0 是否实现了所有 C++17 功能? static inline 受 g++ 8.3 支持。例如,我用std::string 尝试过它,它可以工作。 看起来像编译器错误,它适用于 GCC 9.1 似乎是同一个问题:Why GCC doesn't allow me to create inline static std::stringstream?,但也没有解决方法。评论建议尝试显式初始化 - std::stringstream ss 【参考方案1】:

这几乎可以肯定是一个编译器错误。编译器在一种情况下知道构造函数重载但在另一种情况下不知道,这有点奇怪,尽管它可能与构造函数为 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 是原因https://***.com/a/47782995/4117728。

【讨论】:

以上是关于为啥 std::stringstream 在静态内联时不能默认构造?的主要内容,如果未能解决你的问题,请参考以下文章

std::stringstream 错误?

相当于 %02d 与 std::stringstream?

std::stringstream 可以设置失败/坏位的方式?

与 libmx 链接并使用 std::stringstream 时出现 g++ malloc 错误

将 std::string 转换回使用 std::stringstream << cv::Mat 生成的 cv::Mat

在 VC++14 中使用 std::basic_stringstream<char16_t> 时出错