映射不完全值型(map with incomplete value type)

2019-06-27 20:32发布

我发现了一个错误有以下:

class Test
{
    std::map<std::string,Test> test;
};

错误是“字段有不完全类型‘测试’”。 我阅读建议,这可能是在libcxx的版本中的错误附带的Xcode的几个线程,但它如果我只是将它更改为不我都感到惊讶:

class Test
{
    std::map<std::string,std::shared_ptr<Test>> test;
};

我只是想仔细检查,这绝对是一个正确的错误,而不是一个错误。

干杯!

Answer 1:

该标准要求,在标准库的模板组件中使用的所有类型必须是完整的,除非另有说明。 因此libc的++的错误是正确的。 使用不完整类型是未定义的行为(§17.6.4.8[res.on.functions] / 2),所以的libstdc ++接受它是没有错任一。

你可以使用一个指针对象像你一样来构建完整的类型。 但你也可以使用一些第三方的集合库,它允许不完整的类型,例如boost::container::map被设计为允许不完全类型 。


§17.6.4.8其它功能/ 2:

特别是,结果是不确定的下列情况:

  • ...

  • 如果一个不完整的类型(3.9)实例化一个模板组件时,除非特别允许该组件被用作模板参数。

(即明确地允许不完整的类型是唯一的组分declvalunique_ptrdefault_deleteshared_ptrweak_ptrenable_shared_from_this 。)



文章来源: map with incomplete value type