g++5 中 std::unordered_set 的不完整类型编译错误,在 clang++ 中编译

2023-12-14

考虑与之前的 SO 问题相关的代码C++ 循环依赖与邻接列表表示的混淆

#include <cstddef>
#include <unordered_set>

class Node;

class Hash {
public:
    std::size_t operator()(const Node &node) const;
};

class Node {
public:
    int data;
    std::unordered_set<Node, Hash> links;
};

inline size_t Hash::operator()(const Node &node) const {
    return node.data;
}

int main()
{

}

此代码在使用 g++4.9.2 或 g++5 时无法编译,但可以使用 clang++3.5 进行编译。

g++ 吐出的错误以

error: invalid application of 'sizeof' to incomplete type 'Node' : std::aligned_storage<sizeof(_Tp), std::alignment_of<_Tp>::value>

问题: Does Node声明时必须是完整类型std::unordered_set?在这种情况下,看起来 g++ 或 clang++ 都是错误的。

PS:我知道这种情况可以通过使用来避免std::shared_ptr<Node>相反,但是想了解上面代码中的行为。


使用不完整类型实例化标准库容器是未定义的行为。 [函数解析]/1, 2.5:

1 在某些情况下(替换函数、处理函数、 对用于实例化标准库模板的类型的操作 组件),C++ 标准库取决于提供的组件 通过 C++ 程序。如果这些组件不满足其要求, 本标准对实施没有提出要求。

2 特别是,以下情况的影响未定义:

  • [...]
  • 如果在实例化模板组件时使用不完整类型(3.9)作为模板参数,除非特别允许 该组件。

两种实现都是正确的。

目前有一个proposal为某些容器添加不完整的类型支持,但仅限于vector, list and forward_list.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

g++5 中 std::unordered_set 的不完整类型编译错误,在 clang++ 中编译 的相关文章

随机推荐