为什么 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();
}
但以下不是(相同的编译器,相同的选项),其中 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;
^~
我做错了什么?
这几乎可以肯定是一个编译器错误。编译器在一种情况下知道构造函数重载但在另一种情况下不知道,这有点奇怪,尽管它可能与构造函数 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
是 .
的原因
以下编译良好(在 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();
}
但以下不是(相同的编译器,相同的选项),其中 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;
^~
我做错了什么?
这几乎可以肯定是一个编译器错误。编译器在一种情况下知道构造函数重载但在另一种情况下不知道,这有点奇怪,尽管它可能与构造函数 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
是