相关疑难解决方法(0)

关于 std::vector 中不完整类型的混乱(或 Clang bug?)

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)

有了这个代码:

  • C++17 模式下的 …

c++ llvm clang language-lawyer c++20

7
推荐指数
1
解决办法
402
查看次数

具有不完整值类型的地图

我收到以下错误:

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)

我只想仔细检查这肯定是一个正确的错误,而不是一个错误.

干杯!

c++ std map c++11 libc++

6
推荐指数
1
解决办法
1995
查看次数

标签 统计

c++ ×2

c++11 ×1

c++20 ×1

clang ×1

language-lawyer ×1

libc++ ×1

llvm ×1

map ×1

std ×1