C++20 标准在 [vector.overview]/4 中声明:
如果分配器满足分配器完整性要求,则在实例化向量时可以使用不完整类型 T。T 应在引用所得向量专业化的任何成员之前完成。
默认分配器std::allocate确实满足allocator completeness requirements. 主要问题是“引用”在这种情况下意味着什么。我感到困惑的代码是以下代码的变体:
#include <vector>
class MyClass;
class MyContainer
{
std::vector<MyClass> member;
};
class MyClass {};
int main()
{}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以在各种编译器中正常编译。如果我明确默认默认构造函数,它仍然可以编译:
#include <vector>
class MyClass;
class MyContainer
{
MyContainer() = default;
std::vector<MyClass> member;
};
class MyClass {};
int main()
{}
Run Code Online (Sandbox Code Playgroud)
然而,当我将默认构造函数定义为“空”时,会发生一些奇怪的事情。这是代码(位于编译器资源管理器):
#include <vector>
class MyClass;
class MyContainer
{
MyContainer() {};
std::vector<MyClass> member;
};
class MyClass {};
int main()
{}
Run Code Online (Sandbox Code Playgroud)
有了这个代码:
我收到以下错误:
class Test
{
std::map<std::string,Test> test;
};
Run Code Online (Sandbox Code Playgroud)
错误是"字段具有不完整类型'测试'".我读了一些线程,建议这可能是随xcode附带的libcxx版本中的一个错误,但如果我只需将其更改为:它就不会让我感到惊讶:
class Test
{
std::map<std::string,std::shared_ptr<Test>> test;
};
Run Code Online (Sandbox Code Playgroud)
我只想仔细检查这肯定是一个正确的错误,而不是一个错误.
干杯!