在处理现实项目时,我偶然发现了某些(某些版本)编译器的奇怪行为。考虑以下类声明:
struct OptionalsStruct {
struct InnerType {
bool b{};
};
OptionalsStruct() = default;
std::optional<InnerType> oInnerType;
};
Run Code Online (Sandbox Code Playgroud)
对于某些编译器,它OptionalStruct::InnerType是不可构造的,但不可构造或默认可构造的(clang 11到16和GCC 10),对于其他一些编译器,它既不是不可构造的(clang 9和10),更不用说clang 8如何看待整体事物。
我的问题是:这些行为是编译器错误,还是标准中的漏洞(我使用的是 C++17)?我在这里错过了什么吗?