为啥 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();
但以下不是(相同的编译器,相同的选项),其中stringstream
是static 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 可以设置失败/坏位的方式?
与 libmx 链接并使用 std::stringstream 时出现 g++ malloc 错误
将 std::string 转换回使用 std::stringstream << cv::Mat 生成的 cv::Mat